diff --git a/DEPS b/DEPS
index e9ca3d12..9d8c45f 100644
--- a/DEPS
+++ b/DEPS
@@ -312,7 +312,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '6af0f1febeca72da6472c388d897e87cb897dbc4',
+  'skia_revision': 'dec629b762ec426f9062f25157e9640de60d4d50',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -363,7 +363,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': 'dbdcd758895647028bbc56baf862a1cff07409ff',
+  'freetype_revision': '9a2d6d97b2d8a5d22d02948b783df12b764afa2d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -387,7 +387,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': '5d2512d77e06e5c6938a49192bbea2bed1618afe',
+  'chromium_variations_revision': '7b0c418c18885973e5df7ff3523b911050bf6ae8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -403,7 +403,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': '83ecf63b0b905fb835f38389a8130b4b19265387',
+  'devtools_frontend_revision': '170f1b62ff2ddac12ee66724127335585acc8ece',
   # 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.
@@ -427,7 +427,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'e228605ee7bea07756b742941cfd3aec088311ec',
+  'dawn_revision': 'cd07b9f4050952300ee34b15d84c30a70523e80c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -831,7 +831,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '22b403ffb0f1621c38960ae1cedd464b8efc700c',
+    '6d9a82dba7830e586b0c1e8c01847add8dd68240',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -986,7 +986,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': '2a4hYytl5lMs-Lc3njuI_cUsdvCGjVvNqCnZgo2hapYC',
+          'version': 'w_WvxAtkTYqygcFc1DtLkvJlGU0WRsUg71SxSvIp-cEC',
       },
     ],
     'condition': 'checkout_android',
@@ -1196,13 +1196,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '4eb81e6f13fbf6f9c550d895c7c3e6cfd19d34f7',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '6ba67afd6fb7718743af91b847ddf1907f3ee9a6',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'a13168edbd77143405d485f3347663c320223f66',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'cadbad6bc7fe48b083e0d25eb6feb06fa7a02d89',
     'condition': 'checkout_src_internal',
   },
 
@@ -1713,7 +1713,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/r8',
-              'version': 'cRpPhFe0Ln8wX3pcqOs4cHobiYj7mMi6eVqchALlFUcC',
+              'version': 'jiR3Cmr6zLjEDaMOALv35_EoVDJbl5Mdza1IRQLevjAC',
           },
       ],
       'condition': 'checkout_android',
@@ -1818,7 +1818,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@931022b21e50cacab1d65546c96f9aa8242969f9',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@71b11532ed72adaec5d5e006d92ce741b71379a3',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21',
@@ -1855,10 +1855,10 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'bc3c8bad295ae0ba7f0ddb18848df70f92a820c0',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'cb9d5903ea1dc93ad4fe3e67652e2f65026fc909',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '680c654441704480e9756124770dd683a32d13d1',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'dc43cb24bd8ee85d6a8224c5928ceaf90de729b6',
+    Var('webrtc_git') + '/src.git' + '@' + '0afde7614d1ce398f516f19a032ef94f4c9f1011',
 
   # 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.
@@ -1981,7 +1981,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'wbGp_p_wwG-C7jojM805vwDlBPYOE2nvQweXIDQ35RIC',
+        'version': 'x7BPfckWI79FucQhmJSGRsfDXwWB9RV9_PupgXCwDx0C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1992,7 +1992,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': '1v0PtvRoteG6e8KEbq8laPb9klZ-eCfh-dbEgEPgXf0C',
+        'version': 'D4B8fHXomFuQMqFsRWJNY0Gq2JxJIIaG5bGTfAfljIoC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -2025,7 +2025,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': 'Xfsbd88OenRBWE4llWiL7oyZeQkJKb_b6IMlsn4jTfoC',
+        'version': 'IXXWf2yr65AeFrCgymus2EDznDRtClBl8jVrOCB-lZUC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3942,7 +3942,7 @@
 
   'src/chrome/browser/platform_experience/win': {
       'url': Var('chrome_git') + '/chrome/browser/platform_experience/win.git' + '@' +
-        '8d47eadc639188d06f1ece609096a8e06cb1aae0',
+        'bb7b46198c60bc9af0b1b5b063396befa4dbe0a1',
       'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_browser_context.cc b/android_webview/browser/aw_browser_context.cc
index c6a52ac..97f2e3c4 100644
--- a/android_webview/browser/aw_browser_context.cc
+++ b/android_webview/browser/aw_browser_context.cc
@@ -261,7 +261,7 @@
   // We only use the autocomplete feature of Autofill, which is controlled via
   // the manager_delegate. We don't use the rest of Autofill, which is why it is
   // hardcoded as disabled here.
-  // TODO(crbug.com/873740): The following also disables autocomplete.
+  // TODO(crbug.com/40589187): The following also disables autocomplete.
   // Investigate what the intended behavior is.
   registry->RegisterBooleanPref(autofill::prefs::kAutofillProfileEnabled,
                                 false);
diff --git a/android_webview/browser/aw_field_trials.cc b/android_webview/browser/aw_field_trials.cc
index ed2af211..a5b8030 100644
--- a/android_webview/browser/aw_field_trials.cc
+++ b/android_webview/browser/aw_field_trials.cc
@@ -145,10 +145,10 @@
   // WebView.
   aw_feature_overrides.DisableFeature(::features::kWebOTP);
 
-  // TODO(https://crbug.com/1012899): WebXR is not yet supported on WebView.
+  // TODO(crbug.com/40652382): WebXR is not yet supported on WebView.
   aw_feature_overrides.DisableFeature(::features::kWebXr);
 
-  // TODO(https://crbug.com/1312827): Digital Goods API is not yet supported
+  // TODO(crbug.com/40831925): Digital Goods API is not yet supported
   // on WebView.
   aw_feature_overrides.DisableFeature(::features::kDigitalGoodsApi);
 
@@ -170,7 +170,7 @@
   // Disable dr-dc on webview.
   aw_feature_overrides.DisableFeature(::features::kEnableDrDc);
 
-  // TODO(crbug.com/1100993): Web Bluetooth is not yet supported on WebView.
+  // TODO(crbug.com/40703318): Web Bluetooth is not yet supported on WebView.
   aw_feature_overrides.DisableFeature(::features::kWebBluetooth);
 
   // TODO(crbug.com/933055): WebUSB is not yet supported on WebView.
diff --git a/android_webview/browser/aw_form_database_service_unittest.cc b/android_webview/browser/aw_form_database_service_unittest.cc
index 318f027b..bc0266c 100644
--- a/android_webview/browser/aw_form_database_service_unittest.cc
+++ b/android_webview/browser/aw_form_database_service_unittest.cc
@@ -48,7 +48,7 @@
   std::unique_ptr<AwFormDatabaseService> service_;
 };
 
-// TODO(https://crbug.com/1472844): Fix flakes.
+// TODO(crbug.com/40278752): Fix flakes.
 TEST_F(AwFormDatabaseServiceTest, DISABLED_HasAndClearFormData) {
   EXPECT_FALSE(service_->HasFormData());
   std::vector<FormFieldData> fields;
diff --git a/android_webview/browser/aw_javascript_dialog_manager.cc b/android_webview/browser/aw_javascript_dialog_manager.cc
index 89676a1..4a29a6f 100644
--- a/android_webview/browser/aw_javascript_dialog_manager.cc
+++ b/android_webview/browser/aw_javascript_dialog_manager.cc
@@ -41,7 +41,7 @@
   // origin of the "last committed URL" can be different due to a legacy app-
   // exposed setting, so such a change might be even more breaking.
   //
-  // TODO(crbug.com/1241925): Figure out if some kind of migration can be done
+  // TODO(crbug.com/40194877): Figure out if some kind of migration can be done
   // here, as this is one of several instances in which moving from URL to
   // origin would be desirable.
   //
diff --git a/android_webview/browser/aw_quota_manager_bridge.h b/android_webview/browser/aw_quota_manager_bridge.h
index e29e8d45..19719ed 100644
--- a/android_webview/browser/aw_quota_manager_bridge.h
+++ b/android_webview/browser/aw_quota_manager_bridge.h
@@ -28,7 +28,7 @@
 
 class AwBrowserContext;
 
-// TODO(crbug.com/1215208): Change the functions in this class to reference
+// TODO(crbug.com/40184305): Change the functions in this class to reference
 // StorageKey instead of Origin.
 //
 // This object is owned by the native AwBrowserContext, and the Java peer is
diff --git a/android_webview/browser/cookie_manager.cc b/android_webview/browser/cookie_manager.cc
index e9b34f5f..e2d1e40b 100644
--- a/android_webview/browser/cookie_manager.cc
+++ b/android_webview/browser/cookie_manager.cc
@@ -560,7 +560,7 @@
                                              base::OnceClosure complete) {
   net::CookieOptions options = net::CookieOptions::MakeAllInclusive();
 
-  // TODO(crbug.com/1225444): Complete partitioned cookies implementation for
+  // TODO(crbug.com/40188414): Complete partitioned cookies implementation for
   // WebView. The current implementation is a temporary fix for
   // crbug.com/1442333 to let the app access its 1p partitioned cookie.
   if (GetMojoCookieManager()) {
diff --git a/android_webview/browser/gfx/display_webview.cc b/android_webview/browser/gfx/display_webview.cc
index 9ff76b37..f3ad0e09 100644
--- a/android_webview/browser/gfx/display_webview.cc
+++ b/android_webview/browser/gfx/display_webview.cc
@@ -26,7 +26,7 @@
   std::unique_ptr<viz::OverlayProcessorInterface> overlay_processor;
   OverlayProcessorWebView* overlay_processor_webview_raw = nullptr;
   if (features::IsAndroidSurfaceControlEnabled()) {
-    // TODO(crbug.com/1039876): This is to help triage bugs on pre-release
+    // TODO(crbug.com/40113791): This is to help triage bugs on pre-release
     // android. Remove this log once feature is controlled only by feature flag
     // or launched.
     LOG(WARNING) << "WebView overlays are enabled!";
diff --git a/android_webview/browser/gfx/output_surface_provider_webview.cc b/android_webview/browser/gfx/output_surface_provider_webview.cc
index 69c20dae..ae318ef 100644
--- a/android_webview/browser/gfx/output_surface_provider_webview.cc
+++ b/android_webview/browser/gfx/output_surface_provider_webview.cc
@@ -43,7 +43,7 @@
     std::pair<scoped_refptr<gl::GLSurface>, scoped_refptr<gl::GLContext>>;
 
 GLSurfaceContextPair GetRealContextForVulkan() {
-  // TODO(crbug.com/1143279): Remove all of this after code no longer expects
+  // TODO(crbug.com/40155015): Remove all of this after code no longer expects
   // GL to be present (eg for getting capabilities or calling glGetError).
   static base::NoDestructor<base::WeakPtr<gl::GLSurface>> cached_surface;
   static base::NoDestructor<base::WeakPtr<gl::GLContext>> cached_context;
@@ -89,7 +89,7 @@
       crash_keys::kContextLossReason);
   reason_key.Set(base::NumberToString(static_cast<int>(context_lost_reason)));
 
-  // TODO(https://crbug.com/1112841): Debugging contexts losts. WebView will
+  // TODO(crbug.com/40143203): Debugging contexts losts. WebView will
   // intentionally crash in HardwareRenderer::OnViz::DisplayOutputSurface
   // that will happen after this callback. That crash happens on viz thread and
   // doesn't have any useful information. Crash here on RenderThread to
diff --git a/android_webview/browser/gfx/viz_compositor_thread_runner_webview.cc b/android_webview/browser/gfx/viz_compositor_thread_runner_webview.cc
index 947539e..69be0449 100644
--- a/android_webview/browser/gfx/viz_compositor_thread_runner_webview.cc
+++ b/android_webview/browser/gfx/viz_compositor_thread_runner_webview.cc
@@ -65,8 +65,8 @@
   // Android doesn't support software compositing, but in some cases
   // unaccelerated canvas can use SharedBitmaps as resource so we create
   // SharedBitmapManager anyway.
-  // TODO(1056184): Stop using SharedBitmapManager after fixing fallback to
-  // SharedBitmap.
+  // TODO(crbug.com/40120216): Stop using SharedBitmapManager after fixing
+  // fallback to SharedBitmap.
   server_shared_bitmap_manager_ =
       std::make_unique<viz::ServerSharedBitmapManager>();
 
diff --git a/android_webview/browser/metrics/aw_component_metrics_provider_delegate.cc b/android_webview/browser/metrics/aw_component_metrics_provider_delegate.cc
index f3f7743..b3798e9 100644
--- a/android_webview/browser/metrics/aw_component_metrics_provider_delegate.cc
+++ b/android_webview/browser/metrics/aw_component_metrics_provider_delegate.cc
@@ -25,7 +25,7 @@
 
 // The returned ComponentInfo have component's id and version as this is the
 // only info WebView keeps about components.
-// TODO(https://crbug.com/1228535): record the component's Omaha fingerprint.
+// TODO(crbug.com/40777796): record the component's Omaha fingerprint.
 std::vector<ComponentInfo> AwComponentMetricsProviderDelegate::GetComponents() {
   return component_updater::ComponentsInfoHolder::GetInstance()
       ->GetComponents();
diff --git a/android_webview/browser/safe_browsing/aw_ping_manager_factory.cc b/android_webview/browser/safe_browsing/aw_ping_manager_factory.cc
index bd40ecb8..cbf4df9 100644
--- a/android_webview/browser/safe_browsing/aw_ping_manager_factory.cc
+++ b/android_webview/browser/safe_browsing/aw_ping_manager_factory.cc
@@ -70,7 +70,7 @@
   if (testing_url_loader_factory_) {
     return testing_url_loader_factory_;
   }
-  // TODO(crbug.com/1293957): Support separate SafeBrowsingNetworkContexts per
+  // TODO(crbug.com/40820267): Support separate SafeBrowsingNetworkContexts per
   // browser context instead of having the same one all contexts. If done
   // similar to the chrome/ implementation, GetURLLoaderFactory will take in a
   // browser context as a parameter.
diff --git a/android_webview/common/aw_features.cc b/android_webview/common/aw_features.cc
index 8ac02a8..16b22fe 100644
--- a/android_webview/common/aw_features.cc
+++ b/android_webview/common/aw_features.cc
@@ -187,7 +187,7 @@
              base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Control the default behaviour for the XRequestedWith header.
-// TODO(crbug.com/1493963): enable by default after M120 branch point.
+// TODO(crbug.com/40286009): enable by default after M120 branch point.
 BASE_FEATURE(kWebViewXRequestedWithHeaderControl,
              "WebViewXRequestedWithHeaderControl",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java
index b62c950b..95d396c 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java
@@ -3385,7 +3385,7 @@
         }
     }
 
-    // TODO(crbug.com/1479496): Add override annotation when SDK includes this method.
+    // TODO(crbug.com/40280893): Add override annotation when SDK includes this method.
     public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) {
         return mAwContents.onResolvePointerIcon(event, pointerIndex);
     }
diff --git a/android_webview/java/src/org/chromium/android_webview/variations/FastVariationsSeedSafeModeAction.java b/android_webview/java/src/org/chromium/android_webview/variations/FastVariationsSeedSafeModeAction.java
index 7685584..dfd12db3 100644
--- a/android_webview/java/src/org/chromium/android_webview/variations/FastVariationsSeedSafeModeAction.java
+++ b/android_webview/java/src/org/chromium/android_webview/variations/FastVariationsSeedSafeModeAction.java
@@ -126,7 +126,7 @@
                 .querySafeModeVariationsSeedContentProvider();
     }
 
-    // TODO(crbug.com/1422878): Update this to include timeout capability.
+    // TODO(crbug.com/40259816): Update this to include timeout capability.
     private static class ContentProviderQuery {
         private static final String URI_SUFFIX = ".SafeModeVariationsSeedContentProvider";
         private static final String URI_PATH = VariationsFastFetchModeUtils.URI_PATH;
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/JsJavaInteractionTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/JsJavaInteractionTest.java
index 73481c5..4228f78 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/JsJavaInteractionTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/JsJavaInteractionTest.java
@@ -278,7 +278,8 @@
     @SmallTest
     @Feature({"AndroidWebView", "JsJavaInteraction"})
     public void testAddWebMessageListenerAffectsRendererInitiatedNavigation() throws Throwable {
-        // TODO(crbug.com/969842): We'd either replace the following html file with a file contains
+        // TODO(crbug.com/40630430): We'd either replace the following html file with a file
+        // contains
         // no JavaScript code or add a test to ensure that evaluateJavascript() won't
         // over-trigger DidClearWindowObject.
         loadUrlFromPath(POST_MESSAGE_WITH_PORTS_HTML);
diff --git a/android_webview/js_sandbox/service/js_sandbox_isolate.cc b/android_webview/js_sandbox/service/js_sandbox_isolate.cc
index 1e95999..bfc86c8 100644
--- a/android_webview/js_sandbox/service/js_sandbox_isolate.cc
+++ b/android_webview/js_sandbox/service/js_sandbox_isolate.cc
@@ -64,8 +64,8 @@
 
 namespace {
 
-// TODO(crbug.com/1297672): This is what shows up as filename in errors. Revisit
-// this once error handling is in place.
+// TODO(crbug.com/40215244): This is what shows up as filename in errors.
+// Revisit this once error handling is in place.
 constexpr std::string_view resource_name = "<expression>";
 constexpr jlong kUnknownAssetFileDescriptorLength = -1;
 constexpr int64_t kDefaultChunkSize = 1 << 16;
diff --git a/android_webview/nonembedded/component_updater/aw_component_installer_policy.cc b/android_webview/nonembedded/component_updater/aw_component_installer_policy.cc
index 230dd7e..fb03e4e 100644
--- a/android_webview/nonembedded/component_updater/aw_component_installer_policy.cc
+++ b/android_webview/nonembedded/component_updater/aw_component_installer_policy.cc
@@ -108,7 +108,7 @@
       GetVersionDirName(highest_sequence_number + 1, version.GetString());
   const base::FilePath temp_copy_path =
       temp_dir.GetPath().AppendASCII(new_sequence_version_string);
-  // TODO(crbug.com/1176335) use file links to optimize copies number.
+  // TODO(crbug.com/40747851) use file links to optimize copies number.
   if (!base::CopyDirectory(install_dir, temp_copy_path,
                            /* recursive= */ true)) {
     LOG(ERROR) << "Error copying from " << install_dir << " to "
diff --git a/android_webview/nonembedded/component_updater/aw_component_update_service_test.cc b/android_webview/nonembedded/component_updater/aw_component_update_service_test.cc
index d6f0e6c..612a774 100644
--- a/android_webview/nonembedded/component_updater/aw_component_update_service_test.cc
+++ b/android_webview/nonembedded/component_updater/aw_component_update_service_test.cc
@@ -160,7 +160,7 @@
 };
 
 // A NetworkFetcher that fakes downloading a CRX file.
-// TODO(crbug.com/1190310) use EmbeddedTestServer instead of Mocking the
+// TODO(crbug.com/40755924) use EmbeddedTestServer instead of Mocking the
 // NetworkFetcher.
 class FakeCrxNetworkFetcher : public update_client::NetworkFetcher {
  public:
diff --git a/android_webview/nonembedded/component_updater/registration.cc b/android_webview/nonembedded/component_updater/registration.cc
index 0bb8f98..25bd290 100644
--- a/android_webview/nonembedded/component_updater/registration.cc
+++ b/android_webview/nonembedded/component_updater/registration.cc
@@ -89,7 +89,7 @@
 
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kWebViewEnableTrustTokensComponent)) {
-    // TODO(https://crbug.com/1170468): decide if this component is still
+    // TODO(crbug.com/40165770): decide if this component is still
     // needed. Note: We're using a command-line switch because finch features
     // isn't supported in nonembedded WebView.
     // After setting this flag, it may be necessary to force restart the
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/ComponentsInfoLoader.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/ComponentsInfoLoader.java
index 12804c9..5af1f36 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/ComponentsInfoLoader.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/ComponentsInfoLoader.java
@@ -40,7 +40,7 @@
         for (File componentDirectory : componentDirectories) {
             String[] componentVersions = componentDirectory.list();
 
-            // TODO(https://crbug.com/1231543): Handle multiple versions by sorting semantically and
+            // TODO(crbug.com/40779741): Handle multiple versions by sorting semantically and
             // picking out the highest version
             String version =
                     (componentVersions == null || componentVersions.length == 0)
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/CrashBugUrlFactory.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/CrashBugUrlFactory.java
index 570bd3b..b1bbd06 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/CrashBugUrlFactory.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/CrashBugUrlFactory.java
@@ -21,7 +21,7 @@
 /** Factory class to build bug URI for a crash report. */
 public class CrashBugUrlFactory {
     // There is a limit on the length of this query string, see https://crbug.com/1015923
-    // TODO(https://crbug.com/1052295): add assert statement to check the length of this String.
+    // TODO(crbug.com/40674230): add assert statement to check the length of this String.
     @VisibleForTesting
     public static final String CRASH_REPORT_TEMPLATE =
             """
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/AwComponentUpdateService.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/AwComponentUpdateService.java
index 56dda7b7..491521b 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/AwComponentUpdateService.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/AwComponentUpdateService.java
@@ -94,7 +94,7 @@
         ComponentUpdaterSafeModeUtils.executeSafeModeIfEnabled(
                 new File(ComponentsProviderPathUtil.getComponentUpdateServiceDirectoryPath()));
 
-        // TODO(https://crbug.com/1221092): Stop native updates when onStopJob, onDestroy are
+        // TODO(crbug.com/40773291): Stop native updates when onStopJob, onDestroy are
         // called.
 
         setUnexpectedExit(false);
@@ -157,7 +157,7 @@
             setUnexpectedExit(true);
             mIsUpdating = true;
             final long startTime = SystemClock.uptimeMillis();
-            // TODO(crbug.com/1171817) Once we can log UMA from native, remove the count parameter.
+            // TODO(crbug.com/40745317) Once we can log UMA from native, remove the count parameter.
             AwComponentUpdateServiceJni.get()
                     .startComponentUpdateService(
                             (count) -> {
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
index 5aab656..4bcb585 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
@@ -103,7 +103,7 @@
             PureJavaExceptionHandler.installHandler(AwPureJavaExceptionReporter::new);
             CustomAssertionHandler.installPreNativeHandler(AwPureJavaExceptionReporter::new);
 
-            // TODO(crbug.com/1182693): Do set up a native UMA recorder once we support recording
+            // TODO(crbug.com/40751605): Do set up a native UMA recorder once we support recording
             // metrics from native nonembedded code.
             UmaRecorderHolder.setUpNativeUmaRecorder(false);
 
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/ComponentsProviderService.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/ComponentsProviderService.java
index c31c1a2..495fc2e5 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/ComponentsProviderService.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/ComponentsProviderService.java
@@ -283,7 +283,7 @@
             return;
         }
 
-        // TODO(crbug.com/1256948): schedule it as a periodic job.
+        // TODO(crbug.com/40796101): schedule it as a periodic job.
         final SharedPreferences sharedPreferences =
                 ContextUtils.getApplicationContext()
                         .getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
@@ -312,7 +312,7 @@
         }
     }
 
-    // TODO(crbug.com/1189126): move this to utils class
+    // TODO(crbug.com/40755263): move this to utils class
     @VisibleForTesting
     public static boolean isJobScheduled(JobScheduler scheduler, int jobId) {
         return scheduler.getPendingJob(jobId) != null;
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/MetricsBridgeService.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/MetricsBridgeService.java
index 4baac17..84445aa 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/MetricsBridgeService.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/MetricsBridgeService.java
@@ -169,7 +169,8 @@
                 public void recordMetrics(byte[] data) {
                     if (Binder.getCallingUid() != Process.myUid()) {
                         throw new SecurityException(
-                                "recordMetrics() may only be called by non-embedded WebView processes");
+                                "recordMetrics() may only be called by non-embedded WebView"
+                                        + " processes");
                     }
                     // If this is called within the same process, it will run on the caller thread,
                     // so we will always punt this to thread pool.
@@ -179,11 +180,12 @@
                                 // embedded WebView connects to the service to retrieve and clear
                                 // the records.
                                 if (mRecordsList.size() >= MAX_HISTOGRAM_COUNT) {
-                                    // TODO(https://crbug.com/1088467) add a histogram to log the
+                                    // TODO(crbug.com/40695441) add a histogram to log the
                                     // number of dropped histograms.
                                     Log.w(
                                             TAG,
-                                            "retained records has reached the max capacity, dropping record");
+                                            "retained records has reached the max capacity,"
+                                                    + " dropping record");
                                     return;
                                 }
                                 try {
diff --git a/android_webview/nonembedded/webview_apk_process.cc b/android_webview/nonembedded/webview_apk_process.cc
index 256ee9cd..44f82f3f 100644
--- a/android_webview/nonembedded/webview_apk_process.cc
+++ b/android_webview/nonembedded/webview_apk_process.cc
@@ -35,7 +35,7 @@
 // static
 // Must be called exactly once during the process startup.
 void WebViewApkProcess::Init() {
-  // TODO(crbug.com/1179303): Add check to assert this is only loaded by
+  // TODO(crbug.com/40749658): Add check to assert this is only loaded by
   // LibraryProcessType PROCESS_WEBVIEW_NONEMBEDDED.
 
   // This doesn't have to be thread safe, because it should only happen once on
diff --git a/android_webview/renderer/aw_content_renderer_client.cc b/android_webview/renderer/aw_content_renderer_client.cc
index 0b85837..ecc29d9 100644
--- a/android_webview/renderer/aw_content_renderer_client.cc
+++ b/android_webview/renderer/aw_content_renderer_client.cc
@@ -261,7 +261,7 @@
     const std::string& interface_name,
     mojo::ScopedMessagePipeHandle interface_pipe) {
   // A dirty hack to make SpellCheckHost requests work on WebView.
-  // TODO(crbug.com/806394): Use a WebView-specific service for SpellCheckHost
+  // TODO(crbug.com/40560165): Use a WebView-specific service for SpellCheckHost
   // and SafeBrowsing, instead of |content_browser|.
   RenderThread::Get()->BindHostReceiver(
       mojo::GenericPendingReceiver(interface_name, std::move(interface_pipe)));
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index d580a6e9..6525a32 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -79,6 +79,8 @@
     "accelerators/shortcut_input_handler.h",
     "accelerators/spoken_feedback_toggler.cc",
     "accelerators/spoken_feedback_toggler.h",
+    "accelerators/suspend_state_machine.cc",
+    "accelerators/suspend_state_machine.h",
     "accelerators/tablet_volume_controller.cc",
     "accelerators/tablet_volume_controller.h",
     "accelerometer/accel_gyro_samples_observer.cc",
@@ -3409,6 +3411,7 @@
     "accelerators/rapid_key_sequence_recorder_unittest.cc",
     "accelerators/shortcut_input_handler_unittest.cc",
     "accelerators/spoken_feedback_toggler_unittest.cc",
+    "accelerators/suspend_state_machine_unittest.cc",
     "accelerometer/accel_gyro_samples_observer_unittest.cc",
     "accelerometer/accelerometer_provider_mojo_unittest.cc",
     "accessibility/accessibility_controller_unittest.cc",
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc
index ddb20fb0..bdee1bac 100644
--- a/ash/accelerators/accelerator_controller_impl.cc
+++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -14,6 +14,7 @@
 #include "ash/accelerators/accelerator_notifications.h"
 #include "ash/accelerators/accelerator_shift_disable_capslock_state_machine.h"
 #include "ash/accelerators/debug_commands.h"
+#include "ash/accelerators/suspend_state_machine.h"
 #include "ash/accessibility/accessibility_controller.h"
 #include "ash/constants/ash_features.h"
 #include "ash/constants/devicetype.h"
@@ -403,6 +404,8 @@
       shift_disable_state_machine_(
           std::make_unique<AcceleratorShiftDisableCapslockStateMachine>(
               ui::OzonePlatform::GetInstance()->GetInputController())),
+      suspend_state_machine_(std::make_unique<SuspendStateMachine>(
+          ui::OzonePlatform::GetInstance()->GetInputController())),
       accelerator_configuration_(config),
       output_volume_metric_delay_timer_(
           FROM_HERE,
@@ -444,6 +447,11 @@
         shift_disable_state_machine_.get(),
         ui::EventTarget::Priority::kAccessibility);
   }
+  if (features::IsSuspendStateMachineEnabled()) {
+    aura::Env::GetInstance()->AddPreTargetHandler(
+        suspend_state_machine_.get(),
+        ui::EventTarget::Priority::kAccessibility);
+  }
 }
 
 AcceleratorControllerImpl::~AcceleratorControllerImpl() {
@@ -470,6 +478,10 @@
     aura::Env::GetInstance()->RemovePreTargetHandler(
         shift_disable_state_machine_.get());
   }
+  if (features::IsSuspendStateMachineEnabled()) {
+    aura::Env::GetInstance()->RemovePreTargetHandler(
+        suspend_state_machine_.get());
+  }
 }
 
 void AcceleratorControllerImpl::InputMethodChanged(InputMethodManager* manager,
@@ -581,6 +593,7 @@
   launcher_state_machine_->OnEvent(&key_event);
   capslock_state_machine_->OnEvent(&key_event);
   shift_disable_state_machine_->OnEvent(&key_event);
+  suspend_state_machine_->OnEvent(&key_event);
 }
 
 bool AcceleratorControllerImpl::IsPreferred(
@@ -1327,7 +1340,11 @@
       break;
     case AcceleratorAction::kSuspend:
       base::RecordAction(UserMetricsAction("Accel_Suspend"));
-      accelerators::Suspend();
+      if (!features::IsSuspendStateMachineEnabled()) {
+        accelerators::Suspend();
+      } else {
+        suspend_state_machine_->StartObservingToTriggerSuspend(accelerator);
+      }
       break;
     case AcceleratorAction::kSwapPrimaryDisplay:
       base::RecordAction(UserMetricsAction("Accel_Swap_Primary_Display"));
diff --git a/ash/accelerators/accelerator_controller_impl.h b/ash/accelerators/accelerator_controller_impl.h
index 7f92f48..1c67343 100644
--- a/ash/accelerators/accelerator_controller_impl.h
+++ b/ash/accelerators/accelerator_controller_impl.h
@@ -20,6 +20,7 @@
 #include "ash/accelerators/accelerator_table.h"
 #include "ash/accelerators/ash_accelerator_configuration.h"
 #include "ash/accelerators/exit_warning_handler.h"
+#include "ash/accelerators/suspend_state_machine.h"
 #include "ash/accelerators/tablet_volume_controller.h"
 #include "ash/accessibility/accessibility_controller.h"
 #include "ash/accessibility/ui/accessibility_confirmation_dialog.h"
@@ -247,6 +248,7 @@
   std::unique_ptr<AcceleratorCapslockStateMachine> capslock_state_machine_;
   std::unique_ptr<AcceleratorShiftDisableCapslockStateMachine>
       shift_disable_state_machine_;
+  std::unique_ptr<SuspendStateMachine> suspend_state_machine_;
 
   // Manages all accelerator mappings.
   raw_ptr<AshAcceleratorConfiguration> accelerator_configuration_;
diff --git a/ash/accelerators/suspend_state_machine.cc b/ash/accelerators/suspend_state_machine.cc
new file mode 100644
index 0000000..b0da3aee
--- /dev/null
+++ b/ash/accelerators/suspend_state_machine.cc
@@ -0,0 +1,84 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/accelerators/suspend_state_machine.h"
+
+#include "ash/accelerators/accelerator_commands.h"
+#include "base/containers/fixed_flat_set.h"
+#include "base/metrics/histogram_functions.h"
+#include "ui/base/accelerators/accelerator.h"
+#include "ui/events/event.h"
+#include "ui/events/keycodes/keyboard_code_conversion.h"
+#include "ui/events/keycodes/keyboard_codes_posix.h"
+#include "ui/events/types/event_type.h"
+#include "ui/ozone/public/input_controller.h"
+
+namespace ash {
+
+namespace {
+
+using SuspendStateMachineEvent = SuspendStateMachine::SuspendStateMachineEvent;
+
+void RecordSuspendStateMachineEvent(SuspendStateMachineEvent event) {
+  base::UmaHistogramEnumeration("ChromeOS.Inputs.SuspendStateMachine", event);
+}
+
+}  // namespace
+
+SuspendStateMachine::SuspendStateMachine(ui::InputController* input_controller)
+    : input_controller_(input_controller) {}
+
+SuspendStateMachine::~SuspendStateMachine() = default;
+
+void SuspendStateMachine::StartObservingToTriggerSuspend(
+    const ui::Accelerator& accelerator) {
+  RecordSuspendStateMachineEvent(SuspendStateMachineEvent::kTriggered);
+  trigger_accelerator_ = accelerator;
+}
+
+void SuspendStateMachine::CancelSuspend() {
+  RecordSuspendStateMachineEvent(SuspendStateMachineEvent::kCancelled);
+  trigger_accelerator_.reset();
+}
+
+void SuspendStateMachine::OnKeyEvent(ui::KeyEvent* event) {
+  if (!trigger_accelerator_) {
+    return;
+  }
+
+  // Ignore all repeats.
+  if (event->is_repeat()) {
+    return;
+  }
+
+  // If any key is pressed, the suspend trigger should be cancelled.
+  if (event->type() == ui::ET_KEY_PRESSED) {
+    CancelSuspend();
+    return;
+  }
+  DCHECK_EQ(ui::ET_KEY_RELEASED, event->type());
+
+  // Either the key code of the accelerator must match OR the release key must
+  // have modifiers that match in the accelerator.
+  const bool key_codes_match =
+      trigger_accelerator_->key_code() == event->key_code();
+  const bool modifier_flags_match =
+      (ui::ModifierDomKeyToEventFlag(event->GetDomKey()) &
+       trigger_accelerator_->modifiers()) != 0;
+  if (!key_codes_match && !modifier_flags_match) {
+    CancelSuspend();
+    return;
+  }
+
+  // Only trigger suspend if no keys are currently being held down.
+  if (input_controller_->AreAnyKeysPressed()) {
+    return;
+  }
+
+  RecordSuspendStateMachineEvent(SuspendStateMachineEvent::kSuspended);
+  trigger_accelerator_.reset();
+  accelerators::Suspend();
+}
+
+}  // namespace ash
diff --git a/ash/accelerators/suspend_state_machine.h b/ash/accelerators/suspend_state_machine.h
new file mode 100644
index 0000000..687a5e3
--- /dev/null
+++ b/ash/accelerators/suspend_state_machine.h
@@ -0,0 +1,52 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_ACCELERATORS_SUSPEND_STATE_MACHINE_H_
+#define ASH_ACCELERATORS_SUSPEND_STATE_MACHINE_H_
+
+#include "ash/ash_export.h"
+#include "ui/base/accelerators/accelerator.h"
+#include "ui/events/event_handler.h"
+
+namespace ui {
+class InputController;
+}
+
+namespace ash {
+
+// Tracks when all keys are released for a suspend accelerator and then triggers
+// a suspend DBUS call to power_manager. This prevents the key releases from the
+// accelerator from waking up the system instantly.
+class ASH_EXPORT SuspendStateMachine : public ui::EventHandler {
+ public:
+  // This enum is used for metrics, do not reorder entries.
+  enum class SuspendStateMachineEvent {
+    kTriggered,
+    kCancelled,
+    kSuspended,
+    kMaxValue = kSuspended
+  };
+
+  explicit SuspendStateMachine(ui::InputController* input_controller);
+  SuspendStateMachine(const SuspendStateMachine&) = delete;
+  SuspendStateMachine& operator=(const SuspendStateMachine&) = delete;
+  ~SuspendStateMachine() override;
+
+  // Initializes the state machine to start observing for when all keys are
+  // released to trigger DBUS call to start suspend.
+  void StartObservingToTriggerSuspend(const ui::Accelerator& accelerator);
+
+  // ui::EventHandler:
+  void OnKeyEvent(ui::KeyEvent* event) override;
+
+ private:
+  void CancelSuspend();
+
+  std::optional<ui::Accelerator> trigger_accelerator_;
+  raw_ptr<ui::InputController> input_controller_;
+};
+
+}  // namespace ash
+
+#endif  // ASH_ACCELERATORS_SUSPEND_STATE_MACHINE_H_
diff --git a/ash/accelerators/suspend_state_machine_unittest.cc b/ash/accelerators/suspend_state_machine_unittest.cc
new file mode 100644
index 0000000..b7b746e
--- /dev/null
+++ b/ash/accelerators/suspend_state_machine_unittest.cc
@@ -0,0 +1,400 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/accelerators/suspend_state_machine.h"
+
+#include "ash/test/ash_test_base.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "base/time/time.h"
+#include "chromeos/dbus/power/fake_power_manager_client.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/accelerators/accelerator.h"
+#include "ui/events/base_event_utils.h"
+#include "ui/events/devices/stylus_state.h"
+#include "ui/events/event_constants.h"
+#include "ui/events/keycodes/dom/dom_code.h"
+#include "ui/events/keycodes/dom/dom_key.h"
+#include "ui/events/keycodes/keyboard_codes_posix.h"
+#include "ui/events/types/event_type.h"
+#include "ui/ozone/public/input_controller.h"
+
+namespace ash::accelerators {
+
+namespace {
+
+class MockInputController : public ui::InputController {
+ public:
+  MOCK_METHOD(bool, AreAnyKeysPressed, (), (override));
+
+ private:
+  bool HasMouse() override { return false; }
+  bool HasPointingStick() override { return false; }
+  bool HasTouchpad() override { return false; }
+  bool HasHapticTouchpad() override { return false; }
+  bool IsCapsLockEnabled() override { return false; }
+  void SetCapsLockEnabled(bool enabled) override {}
+  void SetNumLockEnabled(bool enabled) override {}
+  bool IsAutoRepeatEnabled() override { return true; }
+  void SetAutoRepeatEnabled(bool enabled) override {}
+  void SetAutoRepeatRate(const base::TimeDelta& delay,
+                         const base::TimeDelta& interval) override {}
+  void GetAutoRepeatRate(base::TimeDelta* delay,
+                         base::TimeDelta* interval) override {}
+  void SetCurrentLayoutByName(
+      const std::string& layout_name,
+      base::OnceCallback<void(bool)> callback) override {}
+  void SetKeyboardKeyBitsMapping(
+      base::flat_map<int, std::vector<uint64_t>> key_bits_mapping) override {}
+  std::vector<uint64_t> GetKeyboardKeyBits(int id) override {
+    return std::vector<uint64_t>();
+  }
+  void SetTouchEventLoggingEnabled(bool enabled) override {
+    NOTIMPLEMENTED_LOG_ONCE();
+  }
+  void SuspendMouseAcceleration() override {}
+  void EndMouseAccelerationSuspension() override {}
+  void SetThreeFingerClick(bool enabled) override {}
+  void SetGamepadKeyBitsMapping(
+      base::flat_map<int, std::vector<uint64_t>> key_bits_mapping) override {}
+  std::vector<uint64_t> GetGamepadKeyBits(int id) override {
+    return std::vector<uint64_t>();
+  }
+  void SetTapToClickPaused(bool state) override {}
+  void GetTouchDeviceStatus(GetTouchDeviceStatusReply reply) override {
+    std::move(reply).Run(std::string());
+  }
+  void GetTouchEventLog(const base::FilePath& out_dir,
+                        GetTouchEventLogReply reply) override {
+    std::move(reply).Run(std::vector<base::FilePath>());
+  }
+  void DescribeForLog(DescribeForLogReply reply) const override {
+    std::move(reply).Run(std::string());
+  }
+  void SetInternalTouchpadEnabled(bool enabled) override {}
+  bool IsInternalTouchpadEnabled() const override { return false; }
+  void SetTouchscreensEnabled(bool enabled) override {}
+  void GetStylusSwitchState(GetStylusSwitchStateReply reply) override {
+    std::move(reply).Run(ui::StylusState::REMOVED);
+  }
+  void SetInternalKeyboardFilter(
+      bool enable_filter,
+      std::vector<ui::DomCode> allowed_keys) override {}
+  void GetGesturePropertiesService(
+      mojo::PendingReceiver<ui::ozone::mojom::GesturePropertiesService>
+          receiver) override {}
+  void PlayVibrationEffect(int id,
+                           uint8_t amplitude,
+                           uint16_t duration_millis) override {}
+  void StopVibration(int id) override {}
+  void PlayHapticTouchpadEffect(
+      ui::HapticTouchpadEffect effect_type,
+      ui::HapticTouchpadEffectStrength strength) override {}
+  void SetHapticTouchpadEffectForNextButtonRelease(
+      ui::HapticTouchpadEffect effect_type,
+      ui::HapticTouchpadEffectStrength strength) override {}
+  void SetTouchpadSensitivity(std::optional<int> device_id,
+                              int value) override {}
+  void SetTouchpadScrollSensitivity(std::optional<int> device_id,
+                                    int value) override {}
+  void SetTouchpadHapticFeedback(std::optional<int> device_id,
+                                 bool enabled) override {}
+  void SetTouchpadHapticClickSensitivity(std::optional<int> device_id,
+                                         int value) override {}
+  void SetTapToClick(std::optional<int> device_id, bool enabled) override {}
+  void SetTapDragging(std::optional<int> device_id, bool enabled) override {}
+  void SetNaturalScroll(std::optional<int> device_id, bool enabled) override {}
+  void SetMouseSensitivity(std::optional<int> device_id, int value) override {}
+  void SetMouseScrollSensitivity(std::optional<int> device_id,
+                                 int value) override {}
+  void SetMouseReverseScroll(std::optional<int> device_id,
+                             bool enabled) override {}
+  void SetMouseAcceleration(std::optional<int> device_id,
+                            bool enabled) override {}
+  void SetMouseScrollAcceleration(std::optional<int> device_id,
+                                  bool enabled) override {}
+  void SetPointingStickSensitivity(std::optional<int> device_id,
+                                   int value) override {}
+  void SetPointingStickAcceleration(std::optional<int> device_id,
+                                    bool enabled) override {}
+  void SetTouchpadAcceleration(std::optional<int> device_id,
+                               bool enabled) override {}
+  void SetTouchpadScrollAcceleration(std::optional<int> device_id,
+                                     bool enabled) override {}
+  void SetPrimaryButtonRight(std::optional<int> device_id,
+                             bool right) override {}
+  void SetPointingStickPrimaryButtonRight(std::optional<int> device_id,
+                                          bool right) override {}
+  void BlockModifiersOnDevices(std::vector<int> device_ids) override {}
+  bool AreInputDevicesEnabled() const override { return true; }
+  std::unique_ptr<ui::ScopedDisableInputDevices> DisableInputDevices()
+      override {
+    return nullptr;
+  }
+};
+
+// Key representation in test cases.
+struct TestKeyEvent {
+  ui::EventType type;
+  ui::DomCode code;
+  ui::DomKey key;
+  ui::KeyboardCode keycode;
+  ui::EventFlags flags = ui::EF_NONE;
+
+  std::string ToString() const;
+};
+
+// Factory template of TestKeyEvents just to reduce a lot of code/data
+// duplication.
+template <ui::DomCode code,
+          ui::DomKey::Base key,
+          ui::KeyboardCode keycode,
+          ui::EventFlags modifier_flag = ui::EF_NONE,
+          ui::DomKey::Base shifted_key = key>
+struct TestKey {
+  // Returns press key event.
+  static constexpr TestKeyEvent Pressed(ui::EventFlags flags = ui::EF_NONE) {
+    return {ui::ET_KEY_PRESSED, code,
+            (flags & ui::EF_SHIFT_DOWN) ? shifted_key : key, keycode,
+            flags | modifier_flag};
+  }
+
+  // Returns release key event.
+  static constexpr TestKeyEvent Released(ui::EventFlags flags = ui::EF_NONE) {
+    // Note: modifier flag should not be present on release events.
+    return {ui::ET_KEY_RELEASED, code,
+            (flags & ui::EF_SHIFT_DOWN) ? shifted_key : key, keycode, flags};
+  }
+};
+
+// Short cut of TestKey construction for Character keys.
+template <ui::DomCode code,
+          char key,
+          ui::KeyboardCode keycode,
+          char shifted_key = key>
+using TestCharKey = TestKey<code,
+                            ui::DomKey::Constant<key>::Character,
+                            keycode,
+                            ui::EF_NONE,
+                            ui::DomKey::Constant<shifted_key>::Character>;
+
+// Modifier keys.
+using KeyLShift = TestKey<ui::DomCode::SHIFT_LEFT,
+                          ui::DomKey::SHIFT,
+                          ui::VKEY_SHIFT,
+                          ui::EF_SHIFT_DOWN>;
+using KeyRShift = TestKey<ui::DomCode::SHIFT_RIGHT,
+                          ui::DomKey::SHIFT,
+                          ui::VKEY_SHIFT,
+                          ui::EF_SHIFT_DOWN>;
+using KeyLMeta = TestKey<ui::DomCode::META_LEFT,
+                         ui::DomKey::META,
+                         ui::VKEY_LWIN,
+                         ui::EF_COMMAND_DOWN>;
+using KeyRMeta = TestKey<ui::DomCode::META_RIGHT,
+                         ui::DomKey::META,
+                         ui::VKEY_RWIN,
+                         ui::EF_COMMAND_DOWN>;
+using KeyLControl = TestKey<ui::DomCode::CONTROL_LEFT,
+                            ui::DomKey::CONTROL,
+                            ui::VKEY_CONTROL,
+                            ui::EF_CONTROL_DOWN>;
+using KeyRControl = TestKey<ui::DomCode::CONTROL_RIGHT,
+                            ui::DomKey::CONTROL,
+                            ui::VKEY_CONTROL,
+                            ui::EF_CONTROL_DOWN>;
+using KeyLAlt = TestKey<ui::DomCode::ALT_LEFT,
+                        ui::DomKey::ALT,
+                        ui::VKEY_MENU,
+                        ui::EF_ALT_DOWN>;
+using KeyRAlt = TestKey<ui::DomCode::ALT_RIGHT,
+                        ui::DomKey::ALT,
+                        ui::VKEY_MENU,
+                        ui::EF_ALT_DOWN>;
+
+// Character keys. Shift chars are based on US layout.
+using KeyA = TestCharKey<ui::DomCode::US_A, 'a', ui::VKEY_A, 'A'>;
+using KeyB = TestCharKey<ui::DomCode::US_B, 'b', ui::VKEY_B, 'B'>;
+using KeyC = TestCharKey<ui::DomCode::US_C, 'c', ui::VKEY_C, 'C'>;
+
+const bool kKeysPressed = true;
+const bool kNoKeysPressed = false;
+
+using EventTypeVariant = std::variant<TestKeyEvent, bool>;
+using SuspendStateMachineEvent = SuspendStateMachine::SuspendStateMachineEvent;
+
+}  // namespace
+
+class SuspendStateMachineTest
+    : public AshTestBase,
+      public testing::WithParamInterface<
+          std::tuple<ui::Accelerator, std::vector<EventTypeVariant>>> {
+ public:
+  void SetUp() override {
+    AshTestBase::SetUp();
+
+    std::tie(trigger_accelerator_, events_) = GetParam();
+    input_controller_ = std::make_unique<MockInputController>();
+    suspend_state_machine_ =
+        std::make_unique<SuspendStateMachine>(input_controller_.get());
+  }
+
+  void TearDown() override {
+    suspend_state_machine_.reset();
+    AshTestBase::TearDown();
+  }
+
+ protected:
+  std::unique_ptr<SuspendStateMachine> suspend_state_machine_;
+  std::unique_ptr<MockInputController> input_controller_;
+  std::vector<EventTypeVariant> events_;
+  ui::Accelerator trigger_accelerator_;
+};
+
+class SuccessfulSuspendStateMachineTest : public SuspendStateMachineTest {};
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    SuccessfulSuspendStateMachineTest,
+    testing::ValuesIn(
+        std::vector<std::tuple<ui::Accelerator, std::vector<EventTypeVariant>>>{
+            // Standard activations of the suspend.
+            {{ui::VKEY_A, ui::EF_COMMAND_DOWN},
+             {kKeysPressed, KeyLMeta::Released(), kNoKeysPressed,
+              KeyA::Released()}},
+            {{ui::VKEY_B, ui::EF_COMMAND_DOWN},
+             {kKeysPressed, KeyLMeta::Released(), kNoKeysPressed,
+              KeyB::Released()}},
+            {{ui::VKEY_C, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN},
+             {kKeysPressed, KeyLControl::Released(), KeyLAlt::Released(),
+              kNoKeysPressed, KeyC::Released()}},
+
+            // Reversed ordering of releases, checks that ordering does not
+            // matter.
+            {{ui::VKEY_A, ui::EF_COMMAND_DOWN},
+             {kKeysPressed, KeyA::Released(), kNoKeysPressed,
+              KeyLMeta::Released()}},
+            {{ui::VKEY_B, ui::EF_COMMAND_DOWN},
+             {kKeysPressed, KeyB::Released(), kNoKeysPressed,
+              KeyLMeta::Released()}},
+            {{ui::VKEY_C, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN},
+             {kKeysPressed, KeyC::Released(), KeyLAlt::Released(),
+              kNoKeysPressed, KeyLControl::Released()}},
+
+            // Left vs right modifiers does not matter.
+            {{ui::VKEY_A, ui::EF_COMMAND_DOWN},
+             {kKeysPressed, KeyRMeta::Released(), KeyLMeta::Released(),
+              kNoKeysPressed, KeyA::Released()}},
+            {{ui::VKEY_A, ui::EF_ALT_DOWN},
+             {kKeysPressed, KeyRAlt::Released(), KeyLAlt::Released(),
+              kNoKeysPressed, KeyA::Released()}},
+            {{ui::VKEY_A, ui::EF_CONTROL_DOWN},
+             {kKeysPressed, KeyLControl::Released(), KeyRControl::Released(),
+              kNoKeysPressed, KeyA::Released()}},
+            {{ui::VKEY_A, ui::EF_SHIFT_DOWN},
+             {kKeysPressed, KeyLShift::Released(), KeyRShift::Released(),
+              kNoKeysPressed, KeyA::Released()}},
+
+            // All modifiers in one accelerator.
+            {{ui::VKEY_A, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN |
+                              ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN},
+             {kKeysPressed, KeyLControl::Released(), KeyLShift::Released(),
+              KeyLMeta::Released(), KeyRAlt::Released(), kNoKeysPressed,
+              KeyA::Released()}},
+
+            // No modifiers in accelerator.
+            {{ui::VKEY_A, ui::EF_NONE}, {kNoKeysPressed, KeyA::Released()}},
+
+            // Other keys currently held down, not triggered until all keys
+            // released.
+            {{ui::VKEY_A, ui::EF_ALT_DOWN},
+             {kKeysPressed, KeyLAlt::Released(), KeyA::Released(),
+              kNoKeysPressed, KeyRAlt::Released()}},
+
+        }));
+
+TEST_P(SuccessfulSuspendStateMachineTest, SuspendTriggered) {
+  base::HistogramTester histogram_tester;
+
+  suspend_state_machine_->StartObservingToTriggerSuspend(trigger_accelerator_);
+  histogram_tester.ExpectBucketCount("ChromeOS.Inputs.SuspendStateMachine",
+                                     SuspendStateMachineEvent::kTriggered, 1);
+  for (const auto& event : events_) {
+    ASSERT_EQ(0, power_manager_client()->num_request_suspend_calls());
+    if (std::holds_alternative<bool>(event)) {
+      ON_CALL(*input_controller_, AreAnyKeysPressed())
+          .WillByDefault(testing::Return(std::get<bool>(event)));
+      continue;
+    } else {
+      const TestKeyEvent& test_event = std::get<TestKeyEvent>(event);
+      ui::KeyEvent key_event(test_event.type, test_event.keycode,
+                             test_event.code, test_event.flags, test_event.key,
+                             ui::EventTimeForNow());
+      suspend_state_machine_->OnEvent(&key_event);
+    }
+  }
+
+  EXPECT_EQ(1, power_manager_client()->num_request_suspend_calls());
+  histogram_tester.ExpectBucketCount("ChromeOS.Inputs.SuspendStateMachine",
+                                     SuspendStateMachineEvent::kSuspended, 1);
+}
+
+class CancelledSuspendStateMachineTest : public SuspendStateMachineTest {};
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    CancelledSuspendStateMachineTest,
+    testing::ValuesIn(
+        std::vector<std::tuple<ui::Accelerator, std::vector<EventTypeVariant>>>{
+            // Release a key not in the original accelerator.
+            {{ui::VKEY_A, ui::EF_COMMAND_DOWN},
+             {kKeysPressed, KeyLMeta::Released(), KeyB::Released(),
+              kNoKeysPressed, KeyA::Released()}},
+
+            // Release a modifier not in the original accelerator.
+            {{ui::VKEY_A, ui::EF_COMMAND_DOWN},
+             {kKeysPressed, KeyLControl::Released(), kNoKeysPressed,
+              KeyA::Released()}},
+
+            // Press a modifier again in the original accelerator.
+            {{ui::VKEY_A, ui::EF_COMMAND_DOWN},
+             {kKeysPressed, KeyLMeta::Released(), KeyLMeta::Pressed(),
+              KeyLMeta::Released(), kNoKeysPressed, KeyA::Released()}},
+
+            // Press a key not in the original accelerator.
+            {{ui::VKEY_A, ui::EF_COMMAND_DOWN},
+             {kKeysPressed, KeyLMeta::Released(), KeyB::Pressed(),
+              KeyB::Released(), kNoKeysPressed, KeyA::Released()}},
+            {{ui::VKEY_A, ui::EF_COMMAND_DOWN},
+             {kKeysPressed, KeyLMeta::Released(), KeyB::Pressed(),
+              kNoKeysPressed, KeyA::Released()}},
+        }));
+
+TEST_P(CancelledSuspendStateMachineTest, SuspendNotTriggered) {
+  base::HistogramTester histogram_tester;
+
+  suspend_state_machine_->StartObservingToTriggerSuspend(trigger_accelerator_);
+  histogram_tester.ExpectBucketCount("ChromeOS.Inputs.SuspendStateMachine",
+                                     SuspendStateMachineEvent::kTriggered, 1);
+  for (const auto& event : events_) {
+    ASSERT_EQ(0, power_manager_client()->num_request_suspend_calls());
+    if (std::holds_alternative<bool>(event)) {
+      ON_CALL(*input_controller_, AreAnyKeysPressed())
+          .WillByDefault(testing::Return(std::get<bool>(event)));
+      continue;
+    } else {
+      const TestKeyEvent& test_event = std::get<TestKeyEvent>(event);
+      ui::KeyEvent key_event(test_event.type, test_event.keycode,
+                             test_event.code, test_event.flags, test_event.key,
+                             ui::EventTimeForNow());
+      suspend_state_machine_->OnEvent(&key_event);
+    }
+  }
+
+  EXPECT_EQ(0, power_manager_client()->num_request_suspend_calls());
+  histogram_tester.ExpectBucketCount("ChromeOS.Inputs.SuspendStateMachine",
+                                     SuspendStateMachineEvent::kCancelled, 1);
+}
+
+}  // namespace ash::accelerators
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index ea1866b..f1ae379 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -2706,6 +2706,11 @@
              "CrOSSuspendToDisk",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// Enable the suspend state machine to better handle suspend accelerators.
+BASE_FEATURE(kSuspendStateMachine,
+             "SuspendStateMachine",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 const base::FeatureParam<int> kHibernateAfterTimeHours{
     &kSuspendToDisk, "HibernateAfterTimeHours", 8};
 
@@ -4415,6 +4420,10 @@
   return base::FeatureList::IsEnabled(kSnapGroup);
 }
 
+bool IsSuspendStateMachineEnabled() {
+  return base::FeatureList::IsEnabled(kSuspendStateMachine);
+}
+
 bool IsSystemLiveCaptionEnabled() {
   // TODO(b/295244553): Once `kSystemLiveCaption` is enabled by default, switch
   // to `&&`.
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 94b544e..73a4860c 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -839,6 +839,7 @@
 BASE_DECLARE_FEATURE(kStartAssistantAudioDecoderOnDemand);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kSuppressFirstEolWarning);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kSuspendToDisk);
+COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kSuspendStateMachine);
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::FeatureParam<int> kHibernateAfterTimeHours;
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -1297,6 +1298,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 bool IsStartAssistantAudioDecoderOnDemandEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsStoreOwnerKeyInPrivateSlotEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSuspendStateMachineEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSystemLiveCaptionEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSystemNudgeMigrationEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSystemTrayShadowEnabled();
diff --git a/base/android/android_hardware_buffer_compat.cc b/base/android/android_hardware_buffer_compat.cc
index eeb87c10b..59d848d0 100644
--- a/base/android/android_hardware_buffer_compat.cc
+++ b/base/android/android_hardware_buffer_compat.cc
@@ -14,7 +14,7 @@
 AndroidHardwareBufferCompat::AndroidHardwareBufferCompat() {
   DCHECK(IsSupportAvailable());
 
-  // TODO(https://crbug.com/1382595): If the Chromium build requires
+  // TODO(crbug.com/40877384): If the Chromium build requires
   // __ANDROID_API__ >= 26 at some point in the future, we could directly use
   // the global functions instead of dynamic loading. However, since this would
   // be incompatible with pre-Oreo devices, this is unlikely to happen in the
diff --git a/base/android/java/src/org/chromium/base/ApplicationStatus.java b/base/android/java/src/org/chromium/base/ApplicationStatus.java
index bb9daebe..f88ca30 100644
--- a/base/android/java/src/org/chromium/base/ApplicationStatus.java
+++ b/base/android/java/src/org/chromium/base/ApplicationStatus.java
@@ -39,10 +39,10 @@
 import javax.annotation.concurrent.GuardedBy;
 
 /**
- * Provides information about the current activity's status, and a way
- * to register / unregister listeners for state changes.
- * TODO(https://crbug.com/470582): ApplicationStatus will not work on WebView/WebLayer, and
- * should be moved out of base and into //chrome. It should not be relied upon for //components.
+ * Provides information about the current activity's status, and a way to register / unregister
+ * listeners for state changes. TODO(crbug.com/40411113): ApplicationStatus will not work on
+ * WebView/WebLayer, and should be moved out of base and into //chrome. It should not be relied upon
+ * for //components.
  */
 @JNINamespace("base::android")
 public class ApplicationStatus {
diff --git a/base/check.h b/base/check.h
index e3ba8f0..d0081be4 100644
--- a/base/check.h
+++ b/base/check.h
@@ -156,7 +156,7 @@
   // discarding log-stream arguments. See base/notreached.h.
   NOMERGE NOINLINE NOT_TAIL_CALLED static void TriggerNotReached();
 
-  // TODO(crbug.com/851128): Mark [[noreturn]] once this is CHECK-fatal on all
+  // TODO(crbug.com/40580068): Mark [[noreturn]] once this is CHECK-fatal on all
   // builds.
   NOMERGE NOINLINE NOT_TAIL_CALLED ~NotReachedError();
 
@@ -164,8 +164,8 @@
   using CheckError::CheckError;
 };
 
-// TODO(crbug.com/851128): This should take the name of the above class once all
-// callers of NOTREACHED() have migrated to the CHECK-fatal version.
+// TODO(crbug.com/40580068): This should take the name of the above class once
+// all callers of NOTREACHED() have migrated to the CHECK-fatal version.
 class BASE_EXPORT NotReachedNoreturnError : public CheckError {
  public:
   explicit NotReachedNoreturnError(
diff --git a/base/containers/small_map.h b/base/containers/small_map.h
index 159634f..b7429ce0d6 100644
--- a/base/containers/small_map.h
+++ b/base/containers/small_map.h
@@ -492,8 +492,8 @@
     }
 
     size_t i = static_cast<size_t>(position.array_iter_ - array_);
-    // TODO(crbug.com/817982): When we have a checked iterator, this CHECK might
-    // not be necessary.
+    // TODO(crbug.com/40565371): When we have a checked iterator, this CHECK
+    // might not be necessary.
     CHECK_LE(i, size_);
     array_[i].~value_type();
     --size_;
diff --git a/base/containers/util.h b/base/containers/util.h
index cddfa49..529b341 100644
--- a/base/containers/util.h
+++ b/base/containers/util.h
@@ -9,7 +9,7 @@
 
 namespace base {
 
-// TODO(crbug.com/817982): What we really need is for checked_math.h to be
+// TODO(crbug.com/40565371): What we really need is for checked_math.h to be
 // able to do checked arithmetic on pointers.
 template <typename T>
 inline uintptr_t get_uintptr(const T* t) {
diff --git a/base/containers/vector_buffer.h b/base/containers/vector_buffer.h
index 7127796..2fa93cd6 100644
--- a/base/containers/vector_buffer.h
+++ b/base/containers/vector_buffer.h
@@ -76,7 +76,7 @@
   size_t capacity() const { return capacity_; }
 
   T& operator[](size_t i) {
-    // TODO(crbug.com/817982): Some call sites (at least circular_deque.h) are
+    // TODO(crbug.com/40565371): Some call sites (at least circular_deque.h) are
     // calling this with `i == capacity_` as a way of getting `end()`. Therefore
     // we have to allow this for now (`i <= capacity_`), until we fix those call
     // sites to use real iterators. This comment applies here and to `const T&
diff --git a/base/features.cc b/base/features.cc
index 30a8da9..845bf51 100644
--- a/base/features.cc
+++ b/base/features.cc
@@ -39,7 +39,7 @@
              "EnforceNoExecutableFileHandles",
              FEATURE_ENABLED_BY_DEFAULT);
 
-// TODO(crbug.com/851128): Roll out this to 100% before replacing existing
+// TODO(crbug.com/40580068): Roll out this to 100% before replacing existing
 // NOTREACHED()s with NOTREACHED_NORETURN() as part of NOTREACHED() migration.
 // Note that a prerequisite for rolling out this experiment is that existing
 // NOTREACHED reports are at a very low rate. Once this rolls out we should
diff --git a/base/fuchsia/system_product_info_unittest.cc b/base/fuchsia/system_product_info_unittest.cc
index 3c3c925..d3238e4 100644
--- a/base/fuchsia/system_product_info_unittest.cc
+++ b/base/fuchsia/system_product_info_unittest.cc
@@ -122,7 +122,7 @@
   EXPECT_FALSE(product_info.manufacturer()->empty());
 }
 
-// TODO(crbug.com/101396): Re-enable once all clients
+// TODO(crbug.com/40103081): Re-enable once all clients
 // provide this service.
 TEST_F(ProductInfoDeathTest, DISABLED_DcheckOnServiceNotPresent) {
   EXPECT_DCHECK_DEATH_WITH(GetProductInfoViaTask(), "ZX_ERR_PEER_CLOSED");
diff --git a/base/memory/shared_memory_switch.cc b/base/memory/shared_memory_switch.cc
index afa3c1c..dad1ca9 100644
--- a/base/memory/shared_memory_switch.cc
+++ b/base/memory/shared_memory_switch.cc
@@ -156,12 +156,12 @@
   // caller, who is responsible for updating |launch_options| or the zygote
   // launch parameters, as appropriate.
   //
-  // TODO(crbug.com/1028263): Create a wrapper to release and return the primary
-  // descriptor for android (ScopedFD) vs non-android (ScopedFDPair).
+  // TODO(crbug.com/40109064): Create a wrapper to release and return the
+  // primary descriptor for android (ScopedFD) vs non-android (ScopedFDPair).
   //
-  // TODO(crbug.com/1028263): Get rid of |descriptor_to_share| and just populate
-  // |launch_options|. The caller should be responsible for translating between
-  // |launch_options| and zygote parameters as necessary.
+  // TODO(crbug.com/40109064): Get rid of |descriptor_to_share| and just
+  // populate |launch_options|. The caller should be responsible for translating
+  // between |launch_options| and zygote parameters as necessary.
 #if BUILDFLAG(IS_ANDROID)
   descriptor_to_share = std::move(shmem_handle);
 #else
diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc
index 2465add..59e3d57 100644
--- a/base/metrics/histogram.cc
+++ b/base/metrics/histogram.cc
@@ -418,7 +418,7 @@
 
   // Defensive code for backward compatibility.
   if (*minimum < 1) {
-    // TODO(crbug.com/1288842): Temporarily disabled during cleanup.
+    // TODO(crbug.com/40211696): Temporarily disabled during cleanup.
     // DLOG(ERROR) << "Histogram: " << name << " has bad minimum: " << *minimum;
     *minimum = 1;
     if (*maximum < 1)
diff --git a/base/metrics/histogram_shared_memory.cc b/base/metrics/histogram_shared_memory.cc
index 6d02d01..a01bafd 100644
--- a/base/metrics/histogram_shared_memory.cc
+++ b/base/metrics/histogram_shared_memory.cc
@@ -63,7 +63,7 @@
 // 4. The low 64 bits of the shared memory block GUID.
 // 5. The size of the shared memory segment as a string.
 //
-// TODO(crbug.com/1028263): Refactor the common logic here and in
+// TODO(crbug.com/40109064): Refactor the common logic here and in
 // base/metrics/field_trial.cc
 namespace base {
 
@@ -127,7 +127,7 @@
   // Example: The call to OpenSymbolFiles() in base/debug/stack_trace_posix.cc
   // grabs a read-only handle to the shmem region for some process types.
   //
-  // TODO(crbug.com/1028263): Fix ChromeOS and utility processes.
+  // TODO(crbug.com/40109064): Fix ChromeOS and utility processes.
   return (FeatureList::IsEnabled(kPassHistogramSharedMemoryOnLaunch)
 #if BUILDFLAG(IS_CHROMEOS)
           && process_type != "gpu-process"
@@ -172,7 +172,7 @@
 // static
 void HistogramSharedMemory::InitFromLaunchParameters(
     const CommandLine& command_line) {
-  // TODO(crbug.com/1028263): Clean up once fully launched.
+  // TODO(crbug.com/40109064): Clean up once fully launched.
   if (!command_line.HasSwitch(switches::kMetricsSharedMemoryHandle)) {
     return;
   }
diff --git a/base/notreached.h b/base/notreached.h
index be7aaaa..c35804d 100644
--- a/base/notreached.h
+++ b/base/notreached.h
@@ -26,7 +26,7 @@
 // Canary and Dev with intent to roll out to stable in M124 absent any blocking
 // issues that come up.
 //
-// TODO(crbug.com/851128): After kNotReachedIsFatal is universally rolled out
+// TODO(crbug.com/40580068): After kNotReachedIsFatal is universally rolled out
 // then move callers without a non-fatal milestone argument to
 // NOTREACHED_NORETURN(). Then rename the [[noreturn]] version back to
 // NOTREACHED().
@@ -46,8 +46,8 @@
 
 // NOTREACHED_NORETURN() annotates paths that are supposed to be unreachable.
 // They crash if they are ever hit.
-// TODO(crbug.com/851128): Rename back to NOTREACHED() once there are no callers
-// of the old non-CHECK-fatal macro.
+// TODO(crbug.com/40580068): Rename back to NOTREACHED() once there are no
+// callers of the old non-CHECK-fatal macro.
 #if CHECK_WILL_STREAM()
 #define NOTREACHED_NORETURN() ::logging::NotReachedNoreturnError()
 #else
diff --git a/base/power_monitor/battery_level_provider_win.cc b/base/power_monitor/battery_level_provider_win.cc
index 4e0d9f6..97efdc0e 100644
--- a/base/power_monitor/battery_level_provider_win.cc
+++ b/base/power_monitor/battery_level_provider_win.cc
@@ -79,7 +79,7 @@
     if (::GetLastError() == ERROR_FILE_NOT_FOUND) {
       // No battery present in this interface.
       //
-      // TODO(crbug.com/1191045): Change CHECK to DCHECK in October 2022 after
+      // TODO(crbug.com/40756364): Change CHECK to DCHECK in October 2022 after
       // verifying that there are no crash reports.
       CHECK_EQ(battery_tag, static_cast<ULONG>(BATTERY_TAG_INVALID));
       return battery_tag;
diff --git a/base/profiler/module_cache.cc b/base/profiler/module_cache.cc
index 41c086f..e61bb7f 100644
--- a/base/profiler/module_cache.cc
+++ b/base/profiler/module_cache.cc
@@ -75,7 +75,7 @@
     return nullptr;
 
   const auto result = native_modules_.insert(std::move(new_module));
-  // TODO(https://crbug.com/1131769): Reintroduce DCHECK(result.second) after
+  // TODO(crbug.com/40150346): Reintroduce DCHECK(result.second) after
   // fixing the issue that is causing it to fail.
   return result.first->get();
 }
diff --git a/base/run_loop.cc b/base/run_loop.cc
index 2af8260..72a884ff 100644
--- a/base/run_loop.cc
+++ b/base/run_loop.cc
@@ -116,7 +116,7 @@
     return;
 
   // If there is a RunLoopTimeout active then set the timeout.
-  // TODO(crbug.com/905412): Use real-time for Run() timeouts so that they
+  // TODO(crbug.com/40602467): Use real-time for Run() timeouts so that they
   // can be applied even in tests which mock TimeTicks::Now().
   CancelableOnceClosure cancelable_timeout;
   const RunLoopTimeout* run_timeout = GetTimeoutForCurrentThread();
diff --git a/base/strings/escape.cc b/base/strings/escape.cc
index 1e61d69..c241ec6 100644
--- a/base/strings/escape.cc
+++ b/base/strings/escape.cc
@@ -408,7 +408,7 @@
       // character. In that case, just unescaped and write the non-sense
       // character.
       //
-      // TODO(https://crbug.com/829868): Do not unescape illegal UTF-8
+      // TODO(crbug.com/40570496): Do not unescape illegal UTF-8
       // sequences.
       unsigned char non_utf8_byte;
       if (UnescapeUnsignedByteAtIndex(escaped_text, i, &non_utf8_byte)) {
diff --git a/base/strings/string_piece.h b/base/strings/string_piece.h
index 8ef94e51..dca7b39 100644
--- a/base/strings/string_piece.h
+++ b/base/strings/string_piece.h
@@ -5,7 +5,7 @@
 // This header is deprecated. `base::StringPiece` is now `std::string_view`.
 // Use it and <string_view> instead.
 //
-// TODO(crbug.com/691162): Remove uses of this header.
+// TODO(crbug.com/40506050): Remove uses of this header.
 
 #ifndef BASE_STRINGS_STRING_PIECE_H_
 #define BASE_STRINGS_STRING_PIECE_H_
diff --git a/base/task/cancelable_task_tracker.h b/base/task/cancelable_task_tracker.h
index e6325d9a..7abc57a 100644
--- a/base/task/cancelable_task_tracker.h
+++ b/base/task/cancelable_task_tracker.h
@@ -154,7 +154,7 @@
   TaskId next_id_ = 1;
   SEQUENCE_CHECKER(sequence_checker_);
 
-  // TODO(https://crbug.com/1009795): Remove once crasher is resolved.
+  // TODO(crbug.com/40050290): Remove once crasher is resolved.
   base::WeakPtr<CancelableTaskTracker> weak_this_;
   base::WeakPtrFactory<CancelableTaskTracker> weak_factory_{this};
 };
diff --git a/base/test/launcher/test_launcher_unittest.cc b/base/test/launcher/test_launcher_unittest.cc
index 7700049..05356298 100644
--- a/base/test/launcher/test_launcher_unittest.cc
+++ b/base/test/launcher/test_launcher_unittest.cc
@@ -1353,7 +1353,7 @@
 }
 #endif  // !BUILDFLAG(IS_FUCHSIA)
 
-// TODO(crbug.com/1094369): Enable leaked-child checks on other platforms.
+// TODO(crbug.com/40135391): Enable leaked-child checks on other platforms.
 #if BUILDFLAG(IS_FUCHSIA)
 
 // Test that leaves a child process running. The test is DISABLED_, so it can
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index d7b90fe..5a03a71b 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -145,7 +145,7 @@
   #
   # Flag discussion: https://crbug.com/977230
   #
-  # TODO(crbug.com/1131993): This regresses binary size by ~1MB on Android and
+  # TODO(crbug.com/40721698): This regresses binary size by ~1MB on Android and
   # needs to be evaluated before enabling it there as well.
   init_stack_vars = !(is_android && is_official_build)
 
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni
index e6a1872..77041ef 100644
--- a/build/config/compiler/compiler.gni
+++ b/build/config/compiler/compiler.gni
@@ -230,7 +230,7 @@
                             !enable_frame_pointers && current_cpu == "arm"
 
 # Whether or not cfi table should be enabled on arm.
-# TODO(crbug.com/1090409): Replace can_unwind_with_cfi_table with this once
+# TODO(crbug.com/40133751): Replace can_unwind_with_cfi_table with this once
 # sampling profiler is enabled on android.
 enable_arm_cfi_table = is_android && !is_component_build && current_cpu == "arm"
 
diff --git a/build/config/coverage/BUILD.gn b/build/config/coverage/BUILD.gn
index 1a7cabf..1f02cb4 100644
--- a/build/config/coverage/BUILD.gn
+++ b/build/config/coverage/BUILD.gn
@@ -52,7 +52,7 @@
     }
 
     if (is_linux || is_chromeos) {
-      # TODO(crbug.com/1194301): Remove this flag.
+      # TODO(crbug.com/40175589): Remove this flag.
       cflags += [ "-fno-use-cxa-atexit" ]
     }
   }
diff --git a/build/config/fuchsia/test/asan_options.shard.test-cml b/build/config/fuchsia/test/asan_options.shard.test-cml
index 5866d79..7be83d2 100644
--- a/build/config/fuchsia/test/asan_options.shard.test-cml
+++ b/build/config/fuchsia/test/asan_options.shard.test-cml
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 {
   program: {
-    // TODO(crbug.com/1465997): Remove the use of ASAN_OPTIONS once media does
+    // TODO(crbug.com/40276216): Remove the use of ASAN_OPTIONS once media does
     // not load the shared rust library separately.
     environ: [
       "ASAN_OPTIONS=detect_odr_violation=0",
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 560aa8c..5ffc302 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -953,7 +953,7 @@
     additional_manifest_fragments = [
       "//build/config/fuchsia/test/fonts.shard.test-cml",
 
-      # TODO(https://crbug.com/1185811): Investigate removing the requirement
+      # TODO(crbug.com/40055105): Investigate removing the requirement
       # for VmexResource.
       "//build/config/fuchsia/test/mark_vmo_executable.shard.test-cml",
       "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml",
diff --git a/cc/animation/element_animations.cc b/cc/animation/element_animations.cc
index 49ba144..5889a29 100644
--- a/cc/animation/element_animations.cc
+++ b/cc/animation/element_animations.cc
@@ -586,7 +586,8 @@
         // We deliberately use two branches here so that the DCHECK can
         // differentiate between models with different element ids, and the case
         // where some models don't have an element id.
-        // TODO(crbug.com/900241): All KeyframeModels should have an ElementId.
+        // TODO(crbug.com/40600273): All KeyframeModels should have an
+        // ElementId.
         if (model->element_id()) {
           DCHECK(!element_id_for_property ||
                  element_id_for_property == model->element_id())
diff --git a/cc/animation/element_animations.h b/cc/animation/element_animations.h
index 38d43982..39251aa 100644
--- a/cc/animation/element_animations.h
+++ b/cc/animation/element_animations.h
@@ -113,7 +113,7 @@
   // that have changed since the last update.
   void UpdateClientAnimationState();
 
-  // TODO(crbug.com/1176334): Animation targets should be attached to curves
+  // TODO(crbug.com/40747850): Animation targets should be attached to curves
   // when they're created and the concrete subclass is known. This function
   // exists as a stopgap: the animation machinery previously expected to
   // announce a target and then pass curves that would implicitly animate the
diff --git a/cc/animation/keyframe_effect.cc b/cc/animation/keyframe_effect.cc
index 67755910..bea73e29 100644
--- a/cc/animation/keyframe_effect.cc
+++ b/cc/animation/keyframe_effect.cc
@@ -217,7 +217,7 @@
                            PauseCondition pause_condition) {
   bool did_pause = false;
   for (auto& keyframe_model : keyframe_models()) {
-    // TODO(crbug.com/1076012): KeyframeEffect is paused with local time for
+    // TODO(crbug.com/40688021): KeyframeEffect is paused with local time for
     // scroll-linked animations. To make sure the start event of a keyframe
     // model is sent to blink, we should not set its run state to PAUSED until
     // such event is sent. This should be revisited once KeyframeEffect is able
diff --git a/cc/input/input_handler.h b/cc/input/input_handler.h
index 1bd128c..65b845c 100644
--- a/cc/input/input_handler.h
+++ b/cc/input/input_handler.h
@@ -538,7 +538,7 @@
   // compositor side. The information gets shared by the main thread as part of
   // the begin_main_frame_state. Finally Use counters are updated in the main
   // thread side to keep track of the frequency of scrolling with different
-  // sources per page load. TODO(crbug.com/691886): Use GRC API to plumb the
+  // sources per page load. TODO(crbug.com/40506330): Use GRC API to plumb the
   // scroll source info for Use Counters.
   void UpdateScrollSourceInfo(const ScrollState& scroll_state,
                               ui::ScrollInputType type);
diff --git a/cc/input/scroll_snap_data.cc b/cc/input/scroll_snap_data.cc
index fc3db40..94116dd 100644
--- a/cc/input/scroll_snap_data.cc
+++ b/cc/input/scroll_snap_data.cc
@@ -835,7 +835,7 @@
   }
 }
 
-// TODO(crbug.com/1501103): Use tolerance value less than 1.
+// TODO(crbug.com/40941354): Use tolerance value less than 1.
 // It is currently set to 1 because of differences in the way Blink and cc
 // currently handle fractional offsets when snapping.
 constexpr float kSnappedToTolerance = 1.0;
diff --git a/cc/layers/painted_scrollbar_layer.cc b/cc/layers/painted_scrollbar_layer.cc
index c8f0d16..63ae381 100644
--- a/cc/layers/painted_scrollbar_layer.cc
+++ b/cc/layers/painted_scrollbar_layer.cc
@@ -159,7 +159,7 @@
       transform, layer_tree_host()->device_scale_factor());
   float scale = std::max(transform_scales.x(), transform_scales.y());
   // Clamp minimum scale to 1 to avoid too low scale during scale animation.
-  // TODO(crbug.com/1009291): Move rasterization of scrollbars to the impl side
+  // TODO(crbug.com/40100995): Move rasterization of scrollbars to the impl side
   // to better handle scale changes.
   scale = std::max(1.0f, scale);
 
diff --git a/cc/layers/scrollbar_layer_impl_base.cc b/cc/layers/scrollbar_layer_impl_base.cc
index 28ffbca..8dca06a 100644
--- a/cc/layers/scrollbar_layer_impl_base.cc
+++ b/cc/layers/scrollbar_layer_impl_base.cc
@@ -212,7 +212,7 @@
   float track_length = TrackLength();
   int thumb_length = ThumbLength();
   int thumb_thickness = ThumbThickness();
-  // TODO(crbug.com/1239770): This is a speculative fix.
+  // TODO(crbug.com/40194000): This is a speculative fix.
   float maximum = std::max(scroll_layer_length() - clip_layer_length(), 0.0f);
   // TODO(crbug.com/1239510): Re-enable the following DCHECK once the
   // underlying issue is resolved.
diff --git a/cc/layers/solid_color_scrollbar_layer.cc b/cc/layers/solid_color_scrollbar_layer.cc
index 9fe0ed4..ef59ec0 100644
--- a/cc/layers/solid_color_scrollbar_layer.cc
+++ b/cc/layers/solid_color_scrollbar_layer.cc
@@ -110,7 +110,7 @@
   if (layer_tree_host() &&
       layer_tree_host()->GetSettings().using_synchronous_renderer_compositor) {
     // Root frame in Android WebView uses system scrollbars, so make ours
-    // invisible. TODO(crbug.com/1327047): We should apply this to the root
+    // invisible. TODO(crbug.com/40226034): We should apply this to the root
     // scrollbars only, or consider other choices listed in the bug.
     color = SkColors::kTransparent;
   }
diff --git a/cc/layers/video_layer.cc b/cc/layers/video_layer.cc
index 21b6d7de..b9cb5a02 100644
--- a/cc/layers/video_layer.cc
+++ b/cc/layers/video_layer.cc
@@ -30,7 +30,7 @@
 }
 
 bool VideoLayer::RequiresSetNeedsDisplayOnHdrHeadroomChange() const {
-  // TODO(https://crbug.com/1450807): Only return true if the contents of the
+  // TODO(crbug.com/40065199): Only return true if the contents of the
   // video are HDR.
   return true;
 }
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
index f76c00a..eefed73 100644
--- a/cc/metrics/compositor_frame_reporter.cc
+++ b/cc/metrics/compositor_frame_reporter.cc
@@ -1458,7 +1458,7 @@
           reporter->add_high_latency_contribution_stage(stage);
         }
 
-        // TODO(crbug.com/1086974): Set 'drop reason' if applicable.
+        // TODO(crbug.com/40132773): Set 'drop reason' if applicable.
       });
 
   for (const auto& stage : stage_history_) {
@@ -1769,7 +1769,7 @@
                                current_stage_durations.total_blink_latency);
     }
 
-    // TODO(crbug.com/1349930): implement check that ensure the prediction is
+    // TODO(crbug.com/40233949): implement check that ensure the prediction is
     // correct by checking if platform supports breakdown of the stage
     // SubmitCompositorFrameToPresentationCompositorFrame.SwapStartToSwapEnd,
     // then SwapStartToSwapEnd should always be 0s and data for breakdown of it
diff --git a/cc/metrics/compositor_frame_reporting_controller.cc b/cc/metrics/compositor_frame_reporting_controller.cc
index c776b9b3..d59179b 100644
--- a/cc/metrics/compositor_frame_reporting_controller.cc
+++ b/cc/metrics/compositor_frame_reporting_controller.cc
@@ -142,9 +142,9 @@
   if (reporters_[PipelineStage::kBeginImplFrame]) {
     auto& reporter = reporters_[PipelineStage::kBeginImplFrame];
     DCHECK(reporter->did_finish_impl_frame());
-    // TODO(1144353): This is a speculative fix. This code should only be
-    // reached after the previous frame have been explicitly marked as 'did not
-    // produce frame', i.e. this code should have a DCHECK instead of a
+    // TODO(crbug.com/40728802): This is a speculative fix. This code should
+    // only be reached after the previous frame have been explicitly marked as
+    // 'did not produce frame', i.e. this code should have a DCHECK instead of a
     // conditional:
     //   DCHECK(reporter->did_not_produce_frame()).
     if (reporter->did_not_produce_frame()) {
@@ -186,9 +186,9 @@
     auto active_trackers = active_trackers_;
     auto smooth_thread = GetSmoothThread();
     if (args.frame_id == last_started_compositor_frame_.args.frame_id) {
-      // TODO(1277547): Instead of replacing all current information with the
-      // older information from when the impl-frame started, merge the two sets
-      // of information that makes sense.
+      // TODO(crbug.com/40207819): Instead of replacing all current information
+      // with the older information from when the impl-frame started, merge the
+      // two sets of information that makes sense.
       scrolling_thread = last_started_compositor_frame_.scrolling_thread;
       active_trackers = last_started_compositor_frame_.active_trackers;
       smooth_thread = last_started_compositor_frame_.smooth_thread;
diff --git a/cc/metrics/event_metrics.h b/cc/metrics/event_metrics.h
index 2c3e918..8c4d0d1a 100644
--- a/cc/metrics/event_metrics.h
+++ b/cc/metrics/event_metrics.h
@@ -37,9 +37,9 @@
     kMousePressed,
     kMouseReleased,
     kMouseWheel,
-    // TODO(crbug/1071645): Currently, all ET_KEY_PRESSED events are reported
-    // under EventLatency.KeyPressed histogram. This includes both key-down and
-    // key-char events. Consider reporting them separately.
+    // TODO(crbug.com/40126863): Currently, all ET_KEY_PRESSED events are
+    // reported under EventLatency.KeyPressed histogram. This includes both
+    // key-down and key-char events. Consider reporting them separately.
     kKeyPressed,
     kKeyReleased,
     kTouchPressed,
diff --git a/cc/metrics/frame_info.cc b/cc/metrics/frame_info.cc
index ce14b20..a560bfa 100644
--- a/cc/metrics/frame_info.cc
+++ b/cc/metrics/frame_info.cc
@@ -55,8 +55,9 @@
 
 void FrameInfo::MergeWith(const FrameInfo& other) {
 #if BUILDFLAG(IS_ANDROID)
-  // TODO(1278168): on android-webview, multiple frames can be submitted against
-  // the same BeginFrameArgs. This can trip the DCHECK()s in this function.
+  // TODO(crbug.com/40208073): on android-webview, multiple frames can be
+  // submitted against the same BeginFrameArgs. This can trip the DCHECK()s in
+  // this function.
   if (was_merged)
     return;
   if (main_thread_response == MainThreadResponse::kIncluded &&
diff --git a/cc/metrics/frame_sequence_metrics.cc b/cc/metrics/frame_sequence_metrics.cc
index a7d6c1f..d35658a 100644
--- a/cc/metrics/frame_sequence_metrics.cc
+++ b/cc/metrics/frame_sequence_metrics.cc
@@ -512,7 +512,7 @@
         will_ignore_current_frame = true;
       }
 
-      // TODO(crbug.com/1450940): A new FrameSequenceTracker, that has yet to
+      // TODO(crbug.com/40270377): A new FrameSequenceTracker, that has yet to
       // process its first frame uses its creation time as starting point of
       // nested traces. FrameSorter processes a FrameInfo when both threads are
       // complete. It's possible for the smoothness thread component to have
diff --git a/cc/metrics/frame_sequence_tracker.cc b/cc/metrics/frame_sequence_tracker.cc
index f54f1aae..eaa16ddd5 100644
--- a/cc/metrics/frame_sequence_tracker.cc
+++ b/cc/metrics/frame_sequence_tracker.cc
@@ -137,7 +137,7 @@
 }
 
 void FrameSequenceTracker::ResetAllStateIfPaused() {
-  // TODO(crbug.com/1256879): With FrameSequenceMetrics handling
+  // TODO(crbug.com/40200408): With FrameSequenceMetrics handling
   // FrameInfo::FrameFinalState::kNoUpdateDesired we likely do not need this
   // anymore.
   if (!reset_all_state_) {
diff --git a/cc/metrics/scroll_jank_dropped_frame_tracker.cc b/cc/metrics/scroll_jank_dropped_frame_tracker.cc
index c86a5f40..d0ae522 100644
--- a/cc/metrics/scroll_jank_dropped_frame_tracker.cc
+++ b/cc/metrics/scroll_jank_dropped_frame_tracker.cc
@@ -103,7 +103,8 @@
   // There should be at least one presented frame given the method is only
   // called after we have a successful presentation.
   if (per_scroll_->num_presented_frames == 0) {
-    // TODO(1464878): Debug cases where we can have 0 presented frames.
+    // TODO(crbug.com/40067426): Debug cases where we can have 0 presented
+    // frames.
     TRACE_EVENT_INSTANT("input", "NoPresentedFramesInScroll");
     return;
   }
@@ -221,10 +222,10 @@
           EventMetrics::DispatchStage::kGenerated);
   if ((last_input_generation_ts < first_input_generation_ts) ||
       (presentation_ts <= last_input_generation_ts)) {
-    // TODO(crbug/1447358): Investigate when these edge cases can be triggered
-    // in field and web tests. We have already seen this triggered in field, and
-    // some web tests where an event with null(0) timestamp gets coalesced with
-    // a "normal" input.
+    // TODO(crbug.com/40913586): Investigate when these edge cases can be
+    // triggered in field and web tests. We have already seen this triggered in
+    // field, and some web tests where an event with null(0) timestamp gets
+    // coalesced with a "normal" input.
     return;
   }
   // TODO(b/276722271) : Analyze and reduce these cases of out of order
diff --git a/cc/paint/image_transfer_cache_entry.cc b/cc/paint/image_transfer_cache_entry.cc
index 7f60594..e1e5957f 100644
--- a/cc/paint/image_transfer_cache_entry.cc
+++ b/cc/paint/image_transfer_cache_entry.cc
@@ -639,7 +639,7 @@
   sk_sp<SkImage> image;
 
   // Apply tone mapping.
-  // TODO(https://crbug.com/1286088): Pass a shared cache as a parameter.
+  // TODO(crbug.com/40210699): Pass a shared cache as a parameter.
   gfx::ColorConversionSkFilterCache cache;
   if (has_gainmap_) {
     image = cache.ApplyGainmap(
@@ -751,7 +751,7 @@
       image_ =
           image_->makeColorSpace(graphite_recorder_, target_color_space, props);
     } else {
-      // TODO(crbug.com/1443068): It's possible for both `gr_context` and
+      // TODO(crbug.com/40267231): It's possible for both `gr_context` and
       // `graphite_recorder` to be nullptr if `image_` is not texture backed.
       // Need to handle this case (currently just goes through gr_context path
       // with nullptr context).
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc
index f70039a..5b728f23 100644
--- a/cc/paint/oop_pixeltest.cc
+++ b/cc/paint/oop_pixeltest.cc
@@ -758,7 +758,7 @@
 
 #if BUILDFLAG(IS_ANDROID)
   // Allow large quantization error on Android.
-  // TODO(https://crbug.com/1363056): Ensure higher precision for HDR images.
+  // TODO(crbug.com/40238547): Ensure higher precision for HDR images.
   constexpr float kEpsilon = 1 / 16.f;
 #elif BUILDFLAG(IS_IOS) && BUILDFLAG(SKIA_USE_METAL)
   // TODO(crbug.com/1476507): Allow larger errors on iOS as well.
diff --git a/cc/paint/paint_op.cc b/cc/paint/paint_op.cc
index 708221e3..23864ee 100644
--- a/cc/paint/paint_op.cc
+++ b/cc/paint/paint_op.cc
@@ -1254,7 +1254,7 @@
                                       const PaintFlags* flags,
                                       SkCanvas* canvas,
                                       const PlaybackParams& params) {
-  // TODO(crbug.com/931704): make sure to support the case where paint worklet
+  // TODO(crbug.com/40613771): make sure to support the case where paint worklet
   // generated images are used in other raster work such as canvas2d.
   if (op->image.IsPaintWorklet()) {
     // When rasterizing on the main thread (e.g. paint invalidation checking,
diff --git a/cc/paint/paint_op_buffer.h b/cc/paint/paint_op_buffer.h
index 93ddf762..f0e673b 100644
--- a/cc/paint/paint_op_buffer.h
+++ b/cc/paint/paint_op_buffer.h
@@ -134,7 +134,7 @@
     bool context_supports_distance_field_text = true;
     int max_texture_size = 0;
 
-    // TODO(crbug.com/1096123): Cleanup after study completion.
+    // TODO(crbug.com/40136055): Cleanup after study completion.
     //
     // If true, perform serializaion in a way that avoids serializing transient
     // members, such as IDs, so that a stable digest can be calculated. This
diff --git a/cc/tiles/raster_tile_priority_queue_all.cc b/cc/tiles/raster_tile_priority_queue_all.cc
index 38e9060..9683014b 100644
--- a/cc/tiles/raster_tile_priority_queue_all.cc
+++ b/cc/tiles/raster_tile_priority_queue_all.cc
@@ -177,7 +177,7 @@
 
   // Then, use the IsHigherPriorityThan condition for
   // SAME_PRIORITY_FOR_BOTH_TREES and the rest of the priority bins.
-  // TODO(crbug.com/1380831): For SAME_PRIORITY_FOR_BOTH_TREES mode and both
+  // TODO(crbug.com/40244895): For SAME_PRIORITY_FOR_BOTH_TREES mode and both
   // being NOW, should we give the priority to Active NOW instead?
   if (active_priority.IsHigherPriorityThan(pending_priority)) {
     return active_queues_;
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index 5dc67693..bd3c88a6 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -1320,9 +1320,9 @@
 
   // The old locked images tasks have to stay around until past the
   // ScheduleTasks call below, so we do a swap instead of a move.
-  // TODO(crbug.com/647402): Have the tile_task_manager keep a ref on the tasks,
-  // since it makes it awkward for the callers to keep refs on tasks that only
-  // exist within the task graph runner.
+  // TODO(crbug.com/40485121): Have the tile_task_manager keep a ref on the
+  // tasks, since it makes it awkward for the callers to keep refs on tasks that
+  // only exist within the task graph runner.
   locked_image_tasks_.swap(new_locked_image_tasks);
 
   // We must reduce the amount of unused resources before calling
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 80f8728..7393b26 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -4350,7 +4350,7 @@
   // animation_host, so on the last frame of an animation we will
   // still request an extra SetNeedsAnimate here.
   if (animated) {
-    // TODO(crbug.com/1039750): If only scroll animations present, schedule a
+    // TODO(crbug.com/40667010): If only scroll animations present, schedule a
     // frame only if scroll changes.
     SetNeedsOneBeginImplFrame();
     frame_trackers_.StartSequence(
diff --git a/cc/trees/layer_tree_host_pixeltest_filters.cc b/cc/trees/layer_tree_host_pixeltest_filters.cc
index 50b3975..1f0ffad4 100644
--- a/cc/trees/layer_tree_host_pixeltest_filters.cc
+++ b/cc/trees/layer_tree_host_pixeltest_filters.cc
@@ -164,7 +164,7 @@
   }
 #endif
   if (use_software_renderer()) {
-    // TODO(989238): Software renderer does not support/implement
+    // TODO(crbug.com/40036319): Software renderer does not support/implement
     // kClamp_TileMode.
     return;
   }
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index eb76e25..fba61beb 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -9404,7 +9404,7 @@
   FakeContentLayerClient client_;
 };
 
-// TODO(crbug.com/1435551): flaky on win-asan.
+// TODO(crbug.com/40265182): flaky on win-asan.
 #if !(BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER))
 SINGLE_AND_MULTI_THREAD_TEST_F(
     LayerTreeHostTestDelegatedInkMetadataCompositorOnlyFrame);
diff --git a/cc/trees/layer_tree_host_unittest_scroll.cc b/cc/trees/layer_tree_host_unittest_scroll.cc
index 21c3e04..fd4bd5e 100644
--- a/cc/trees/layer_tree_host_unittest_scroll.cc
+++ b/cc/trees/layer_tree_host_unittest_scroll.cc
@@ -1111,8 +1111,8 @@
 // This tests scrolling on the impl side which is only possible with a thread.
 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestImplOnlyScroll);
 
-// TODO(crbug.com/574283): Mac currently doesn't support smooth scrolling wheel
-// events.
+// TODO(crbug.com/40451005): Mac currently doesn't support smooth scrolling
+// wheel events.
 #if !BUILDFLAG(IS_MAC)
 // This test simulates scrolling on the impl thread such that it starts a scroll
 // animation. It ensures that RequestScrollAnimationEndNotification() correctly
@@ -1524,7 +1524,7 @@
   ElementId snap_area_b_id_;
 };
 
-// TODO(crbug.com/1243814): Test is flaky on Chrome OS (both Ash and Lacros).
+// TODO(crbug.com/40787490): Test is flaky on Chrome OS (both Ash and Lacros).
 #if !BUILDFLAG(IS_CHROMEOS)
 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestImplOnlyMultipleScrollSnap);
 #endif
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index e02fa7c..2c1d666 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -2548,7 +2548,7 @@
       // The intention here is to skip over any layers that belong to a
       // different 3d sorting context than the first_hit layer.
       //
-      // TODO(crbug.com/1407697): This code is kind of broken for the case of a
+      // TODO(crbug.com/40887983): This code is kind of broken for the case of a
       // scroller inside a preserve-3d: we assign a sorting_context_id to the
       // scroller's main layer, which is marked as scrollable, but not its
       // scrolling-contents layer, which is first_hit.  Currently we rely on
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
index 2bb81a4..e86f915 100644
--- a/cc/trees/property_tree.cc
+++ b/cc/trees/property_tree.cc
@@ -1684,7 +1684,7 @@
   const TransformNode* transform_node =
       property_trees()->transform_tree().Node(scroll_node.transform_id);
 
-  // TODO(crbug.com/1418689): current_scroll_offset can disagree with
+  // TODO(crbug.com/40894892): current_scroll_offset can disagree with
   // transform_node->scroll_offset if the delta on a main frame update is
   // simply rounding of the scroll position and not using fractional scroll
   // deltas (see needs_scroll_update in PushScrollUpdatesFromMainThread).
@@ -1702,8 +1702,8 @@
     // snapping needed, due to floating point precision errors. In general this
     // is fine, but we never want to report a negative scroll offset so avoid
     // that case here.
-    // TODO(crbug.com/1076878): Remove the clamping when scroll timeline effects
-    // always match the snapping.
+    // TODO(crbug.com/40688441): Remove the clamping when scroll timeline
+    // effects always match the snapping.
     offset = ClampScrollOffsetToLimits(offset - transform_node->snap_amount,
                                        scroll_node);
   }
diff --git a/chrome/VERSION b/chrome/VERSION
index 2ed9e7d2..150d0b6 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=126
 MINOR=0
-BUILD=6429
+BUILD=6431
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 55cc1c7..3d38a06 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -1985,6 +1985,7 @@
       "//third_party/blink/public/mojom:mojom_core_java",
       "//third_party/blink/public/mojom:mojom_mhtml_load_result_java",
       "//third_party/blink/public/mojom:mojom_platform_java",
+      "//third_party/blink/public/mojom:web_feature_mojo_bindings_java",
       "//third_party/flatbuffers:flatbuffers_java",
       "//third_party/hamcrest:hamcrest_java",
       "//third_party/jni_zero:jni_zero_java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 5dd33e3..562d10c 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -15,6 +15,7 @@
   "javatests/src/org/chromium/chrome/browser/ChromeActionModeHandlerTest.java",
   "javatests/src/org/chromium/chrome/browser/ChromeTabbedActivityTest.java",
   "javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java",
+  "javatests/src/org/chromium/chrome/browser/ContentWebFeatureUsageUtilsIntegrationTest.java",
   "javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java",
   "javatests/src/org/chromium/chrome/browser/ExampleUiCaptureTest.java",
   "javatests/src/org/chromium/chrome/browser/FeaturesAnnotationsTest.java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils.java
index e1b7155..839b034 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils.java
@@ -13,7 +13,7 @@
 import org.chromium.base.ApplicationStatus;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
-import org.chromium.chrome.browser.profiles.ProfileManager;
+import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
@@ -37,6 +37,7 @@
     private static TabModelSelectorTabObserver sTabModelSelectorTabObserver;
 
     public static void maybeShowIPH(
+            Profile profile,
             @FeatureConstants String featureName,
             View view,
             @Nullable BottomSheetController bottomSheetController) {
@@ -63,8 +64,7 @@
                 return;
         }
 
-        final Tracker tracker =
-                TrackerFactory.getTrackerForProfile(ProfileManager.getLastUsedRegularProfile());
+        final Tracker tracker = TrackerFactory.getTrackerForProfile(profile);
         if (!tracker.isInitialized()) return;
         if (!tracker.shouldTriggerHelpUI(featureName)) return;
 
@@ -133,6 +133,7 @@
                                 || (navigationHandle.pageTransition() & PageTransition.CORE_MASK)
                                         == PageTransition.GENERATED) {
                             maybeShowIPH(
+                                    tab.getProfile(),
                                     FeatureConstants.TAB_GROUPS_QUICKLY_COMPARE_PAGES_FEATURE,
                                     tab.getView(),
                                     null);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java
index 355c29d..7b47f6d 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java
@@ -257,6 +257,7 @@
                 && mBottomSheetController.getSheetState()
                         == BottomSheetController.SheetState.HIDDEN) {
             TabGroupUtils.maybeShowIPH(
+                    mTabModelSelector.getModel(false).getProfile(),
                     FeatureConstants.TAB_GROUPS_TAP_TO_SEE_ANOTHER_TAB_FEATURE,
                     mTabStripCoordinator.getContainerView(),
                     mBottomSheetController);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
index d283a33..03feb08 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -285,6 +285,7 @@
                             TaskTraits.UI_DEFAULT,
                             () -> {
                                 TabGroupUtils.maybeShowIPH(
+                                        mProfile,
                                         FeatureConstants.TAB_GROUPS_YOUR_TABS_ARE_TOGETHER_FEATURE,
                                         anchor,
                                         null);
diff --git a/chrome/android/java/res/layout/search_activity.xml b/chrome/android/java/res/layout/search_activity.xml
index a392c8b..3c70728 100644
--- a/chrome/android/java/res/layout/search_activity.xml
+++ b/chrome/android/java/res/layout/search_activity.xml
@@ -12,13 +12,13 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent" >
 
-    <ViewStub
+    <org.chromium.ui.AsyncViewStub
             android:id="@+id/omnibox_results_container_stub"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             app:layout_anchor="@id/toolbar"
             android:background="@android:color/white"
-            android:layout="@layout/omnibox_results_container" />
+            app:layout="@layout/omnibox_results_container" />
 
     <FrameLayout
             android:id="@+id/toolbar"
diff --git a/chrome/android/java/res_app/layout/main.xml b/chrome/android/java/res_app/layout/main.xml
index c406333..8c70d54 100644
--- a/chrome/android/java/res_app/layout/main.xml
+++ b/chrome/android/java/res_app/layout/main.xml
@@ -91,13 +91,13 @@
             android:layout_width="0dp"
             android:layout_height="0dp" />
 
-        <ViewStub
+        <org.chromium.ui.AsyncViewStub
             android:id="@+id/omnibox_results_container_stub"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             app:layout_anchor="@id/control_container"
             android:inflatedId="@+id/omnibox_results_container"
-            android:layout="@layout/omnibox_results_container" />
+            app:layout="@layout/omnibox_results_container" />
 
         <!-- Toolbar size area painted black to avoid the action bar showing the window background -->
         <View
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
index d7bea33..fa4be20 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -212,7 +212,7 @@
                     // occur, and we'll need to manually update the bottom indicator here.
                     if (!mInReorderMode) {
                         finishAnimations();
-                        buildBottomIndicator();
+                        rebuildStripViews();
                         mRenderHost.requestRender();
                     }
                 }
@@ -234,7 +234,7 @@
                             || mTabGroupModelFilter.getTabGroupCount()
                                     != mStripGroupTitles.length) {
                         finishAnimations();
-                        buildBottomIndicator();
+                        rebuildStripViews();
                         mRenderHost.requestRender();
                     }
                 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ContentWebFeatureUsageUtilsIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ContentWebFeatureUsageUtilsIntegrationTest.java
new file mode 100644
index 0000000..7ea59a1
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ContentWebFeatureUsageUtilsIntegrationTest.java
@@ -0,0 +1,54 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.HistogramWatcher;
+import org.chromium.blink.mojom.WebFeature;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+import org.chromium.content_public.browser.ContentWebFeatureUsageUtils;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.net.test.EmbeddedTestServer;
+
+/** Integration tests for {@link ContentWebFeatureUsageUtils}. */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Batch(Batch.PER_CLASS)
+public class ContentWebFeatureUsageUtilsIntegrationTest {
+    @Rule
+    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
+
+    @Before
+    public void setUp() {
+        EmbeddedTestServer testServer = mActivityTestRule.getTestServer();
+        mActivityTestRule.startMainActivityWithURL(
+                testServer.getURL("/chrome/test/data/android/simple.html"));
+    }
+
+    @Test
+    @SmallTest
+    public void testLogWebFeatureForCurrentPage() {
+        HistogramWatcher histogramWatcher =
+                HistogramWatcher.newSingleRecordWatcher(
+                        "Blink.UseCounter.Features", WebFeature.IDENTITY_DIGITAL_CREDENTIALS);
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    ContentWebFeatureUsageUtils.logWebFeatureForCurrentPage(
+                            mActivityTestRule.getWebContents(),
+                            WebFeature.IDENTITY_DIGITAL_CREDENTIALS);
+                });
+        histogramWatcher.assertExpected();
+    }
+}
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 2bdf9db..d7cc318 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -7705,6 +7705,11 @@
      kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kSearchCustomizableShortcutsInLauncher)},
 
+    {"enable-suspend-state-machine",
+     flag_descriptions::kEnableSuspendStateMachineName,
+     flag_descriptions::kEnableSuspendStateMachineDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(ash::features::kSuspendStateMachine)},
+
     {"enable-input-device-settings-split",
      flag_descriptions::kEnableInputDeviceSettingsSplitName,
      flag_descriptions::kEnableInputDeviceSettingsSplitDescription, kOsCrOS,
diff --git a/chrome/browser/compose/compose_session.cc b/chrome/browser/compose/compose_session.cc
index 558ce8f6..5d889a8 100644
--- a/chrome/browser/compose/compose_session.cc
+++ b/chrome/browser/compose/compose_session.cc
@@ -968,6 +968,7 @@
     AddNewResponseToHistory(std::move(new_state));
   }
   std::move(callback).Run(true);
+  session_events_.result_edit_count += 1;
 }
 
 void ComposeSession::InitializeWithText(const std::optional<std::string>& text,
@@ -1129,6 +1130,9 @@
     case compose::ComposeSessionCloseReason::kAcceptedSuggestion:
       final_status_ = optimization_guide::proto::FinalStatus::STATUS_INSERTED;
       session_events_.inserted_results = true;
+      if (CurrentState().has_value() && CurrentState()->is_user_edited()) {
+        session_events_.edited_result_inserted = true;
+      }
       break;
   }
 }
diff --git a/chrome/browser/compose/compose_session.h b/chrome/browser/compose/compose_session.h
index 3b1ac802..7a37041 100644
--- a/chrome/browser/compose/compose_session.h
+++ b/chrome/browser/compose/compose_session.h
@@ -155,8 +155,6 @@
   void EditResult(const std::string& new_result,
                   EditResultCallback callback) override;
 
-  void PrintCurrentHistoryState();
-
   // Non-ComposeSessionUntrustedPageHandler Methods
 
   // Notifies the session that a new dialog is opening and starts refreshing
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 17629d5..ae6ed70 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -3794,6 +3794,14 @@
     "expiry_milestone": 130
   },
   {
+    "name": "enable-suspend-state-machine",
+    "owners": [
+      "dpad@chromium.org",
+      "cros-peripherals@google.com"
+    ],
+    "expiry_milestone": 130
+  },
+  {
     "name": "enable-suspend-to-disk",
     "owners": [ "bgeffon@chromium.org", "mka@chromium.org", "chromeos-power@google.com" ],
     "expiry_milestone": 130
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 577ac21..28ba03a5 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1277,6 +1277,11 @@
 const char kEnableSearchCustomizableShortcutsInLauncherDescription[] =
     "Enable searching for customizable shortcuts in launcher.";
 
+const char kEnableSuspendStateMachineName[] = "Enable suspend state machine";
+const char kEnableSuspendStateMachineDescription[] =
+    "Enables a fix for the suspend keyboard shortcut to more consistently "
+    "execute.";
+
 const char kEnableInputDeviceSettingsSplitName[] =
     "Enable input device settings split";
 const char kEnableInputDeviceSettingsSplitDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index ad996ed..9676b6e 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -871,6 +871,9 @@
 extern const char kEnableSearchCustomizableShortcutsInLauncherName[];
 extern const char kEnableSearchCustomizableShortcutsInLauncherDescription[];
 
+extern const char kEnableSuspendStateMachineName[];
+extern const char kEnableSuspendStateMachineDescription[];
+
 extern const char kEnableInputDeviceSettingsSplitName[];
 extern const char kEnableInputDeviceSettingsSplitDescription[];
 
diff --git a/chrome/browser/lens/core/mojom/BUILD.gn b/chrome/browser/lens/core/mojom/BUILD.gn
index 1c472179..54adf80 100644
--- a/chrome/browser/lens/core/mojom/BUILD.gn
+++ b/chrome/browser/lens/core/mojom/BUILD.gn
@@ -9,6 +9,7 @@
     "geometry.mojom",
     "lens.mojom",
     "overlay_object.mojom",
+    "polygon.mojom",
     "search_bubble.mojom",
     "text.mojom",
   ]
diff --git a/chrome/browser/lens/core/mojom/geometry.mojom b/chrome/browser/lens/core/mojom/geometry.mojom
index 11907f0..f8664c5e 100644
--- a/chrome/browser/lens/core/mojom/geometry.mojom
+++ b/chrome/browser/lens/core/mojom/geometry.mojom
@@ -4,6 +4,7 @@
 
 module lens.mojom;
 
+import "chrome/browser/lens/core/mojom/polygon.mojom";
 import "ui/gfx/geometry/mojom/geometry.mojom";
 
 struct CenterRotatedBox {
@@ -31,4 +32,6 @@
 struct Geometry {
   // Specifies the bounding box for this geometry.
   CenterRotatedBox bounding_box;
+
+  array<Polygon> segmentation_polygon;
 };
diff --git a/chrome/browser/lens/core/mojom/polygon.mojom b/chrome/browser/lens/core/mojom/polygon.mojom
new file mode 100644
index 0000000..ab35ebf
--- /dev/null
+++ b/chrome/browser/lens/core/mojom/polygon.mojom
@@ -0,0 +1,33 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// These Mojo structs are converted from
+// third_party/lens_server_proto/lens_overlay_polygon.proto.
+module lens.mojom;
+
+
+struct Polygon {
+  array<Vertex> vertex;
+
+  enum VertexOrdering {
+    kUnspecified = 0,
+    kClockwise = 1,
+    kCounterClockwise = 2,
+  };
+  VertexOrdering vertex_ordering;
+
+  enum CoordinateType {
+    kUnspecified = 0,
+    // Normalized coordinates.
+    kNormalized = 1,
+    // Image pixel coordinates.
+    kImage = 2,
+  };
+  CoordinateType coordinate_type;
+};
+
+struct Vertex {
+  float x;
+  float y;
+};
diff --git a/chrome/browser/lens/lens_overlay/lens_overlay_proto_converter.cc b/chrome/browser/lens/lens_overlay/lens_overlay_proto_converter.cc
index 417308dd..ad462c2 100644
--- a/chrome/browser/lens/lens_overlay/lens_overlay_proto_converter.cc
+++ b/chrome/browser/lens/lens_overlay/lens_overlay_proto_converter.cc
@@ -6,8 +6,10 @@
 
 #include "chrome/browser/lens/core/mojom/geometry.mojom.h"
 #include "chrome/browser/lens/core/mojom/overlay_object.mojom.h"
+#include "chrome/browser/lens/core/mojom/polygon.mojom.h"
 #include "chrome/browser/lens/core/mojom/text.mojom.h"
 #include "third_party/lens_server_proto/lens_overlay_geometry.pb.h"
+#include "third_party/lens_server_proto/lens_overlay_polygon.pb.h"
 #include "third_party/lens_server_proto/lens_overlay_server.pb.h"
 #include "third_party/lens_server_proto/lens_overlay_service_deps.pb.h"
 #include "third_party/lens_server_proto/lens_overlay_text.pb.h"
@@ -16,6 +18,47 @@
 
 namespace {
 
+lens::mojom::Polygon_VertexOrdering ProtoToMojo(
+    lens::Polygon::VertexOrdering vertex_ordering) {
+  switch (vertex_ordering) {
+    case lens::Polygon::VERTEX_ORDERING_UNSPECIFIED:
+      return lens::mojom::Polygon_VertexOrdering::kUnspecified;
+    case lens::Polygon::CLOCKWISE:
+      return lens::mojom::Polygon_VertexOrdering::kClockwise;
+    case lens::Polygon::COUNTER_CLOCKWISE:
+      return lens::mojom::Polygon_VertexOrdering::kCounterClockwise;
+  }
+  return lens::mojom::Polygon_VertexOrdering::kUnspecified;
+}
+
+lens::mojom::Polygon_CoordinateType ProtoToMojo(
+    lens::CoordinateType coordinate_type) {
+  switch (coordinate_type) {
+    case lens::COORDINATE_TYPE_UNSPECIFIED:
+      return lens::mojom::Polygon_CoordinateType::kUnspecified;
+    case lens::NORMALIZED:
+      return lens::mojom::Polygon_CoordinateType::kNormalized;
+    case lens::IMAGE:
+      return lens::mojom::Polygon_CoordinateType::kImage;
+  }
+  return lens::mojom::Polygon_CoordinateType::kUnspecified;
+}
+
+lens::mojom::PolygonPtr CreatePolygonMojomFromProto(
+    lens::Polygon proto_polygon) {
+  lens::mojom::PolygonPtr polygon = lens::mojom::Polygon::New();
+
+  std::vector<lens::mojom::VertexPtr> vertices;
+  for (auto vertex : proto_polygon.vertex()) {
+    vertices.push_back(lens::mojom::Vertex::New(vertex.x(), vertex.y()));
+  }
+  polygon->vertex = std::move(vertices);
+  polygon->vertex_ordering = ProtoToMojo(proto_polygon.vertex_ordering());
+  polygon->coordinate_type = ProtoToMojo(proto_polygon.coordinate_type());
+
+  return polygon;
+}
+
 lens::mojom::GeometryPtr CreateGeometryMojomFromProto(
     lens::Geometry response_geometry) {
   lens::mojom::GeometryPtr geometry = lens::mojom::Geometry::New();
@@ -38,6 +81,13 @@
   center_rotated_box->rotation = bounding_box_response.rotation_z();
 
   geometry->bounding_box = std::move(center_rotated_box);
+
+  std::vector<lens::mojom::PolygonPtr> polygons;
+  for (auto polygon : response_geometry.segmentation_polygon()) {
+    polygons.push_back(CreatePolygonMojomFromProto(polygon));
+  }
+  geometry->segmentation_polygon = std::move(polygons);
+
   return geometry;
 }
 
diff --git a/chrome/browser/lens/lens_overlay/lens_overlay_proto_converter_unittest.cc b/chrome/browser/lens/lens_overlay/lens_overlay_proto_converter_unittest.cc
index 3231db58..3d8e2ca 100644
--- a/chrome/browser/lens/lens_overlay/lens_overlay_proto_converter_unittest.cc
+++ b/chrome/browser/lens/lens_overlay/lens_overlay_proto_converter_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/lens/core/mojom/geometry.mojom.h"
+#include "chrome/browser/lens/core/mojom/polygon.mojom.h"
 #include "chrome/browser/lens/core/mojom/overlay_object.mojom-forward.h"
 #include "chrome/browser/lens/core/mojom/overlay_object.mojom.h"
 #include "chrome/browser/lens/core/mojom/text.mojom-forward.h"
@@ -95,6 +96,14 @@
     return object;
   }
 
+  lens::OverlayObject CreateServerOverlayObjectWithPolygon(
+      BoundingBoxStruct box) {
+    lens::OverlayObject object;
+    object.set_id(box.id);
+    CreateServerGeometryWithPolygon(box, object.mutable_geometry());
+    return object;
+  }
+
   void CreateServerText(TextStruct text_struct, lens::Text* text) {
     text->set_content_language(text_struct.content_language);
     auto* paragraph = text->mutable_text_layout()->add_paragraphs();
@@ -122,7 +131,18 @@
     geometry->mutable_bounding_box()->set_coordinate_type(box.coordinate_type);
   }
 
-  void VerifiyGeometryDimensionsAreEqual(
+  void CreateServerGeometryWithPolygon(
+      BoundingBoxStruct box, lens::Geometry* geometry) {
+    CreateServerGeometry(box, geometry);
+    auto* polygon = geometry->add_segmentation_polygon();
+    auto* vertex = polygon->add_vertex();
+    vertex->set_x(0.19);
+    vertex->set_y(0.21);
+    polygon->set_vertex_ordering(lens::Polygon::CLOCKWISE);
+    polygon->set_coordinate_type(lens::NORMALIZED);
+  }
+
+  void VerifyGeometriesAreEqual(
       lens::Geometry server_geometry,
       lens::mojom::GeometryPtr mojo_geometry) {
     EXPECT_EQ(gfx::PointF(server_geometry.bounding_box().center_x(),
@@ -136,6 +156,29 @@
     EXPECT_EQ(
         static_cast<int>(server_geometry.bounding_box().coordinate_type()),
         static_cast<int>(mojo_geometry->bounding_box->coordinate_type));
+
+    EXPECT_EQ(static_cast<size_t>(
+                  server_geometry.segmentation_polygon().size()),
+              mojo_geometry->segmentation_polygon.size());
+    for (int i = 0; i < server_geometry.segmentation_polygon().size(); i++) {
+      lens::Polygon server_polygon =
+          server_geometry.segmentation_polygon().at(i);
+      lens::mojom::PolygonPtr mojo_polygon =
+          mojo_geometry->segmentation_polygon.at(i)->Clone();
+      EXPECT_EQ(static_cast<size_t>(server_polygon.vertex().size()),
+                mojo_polygon->vertex.size());
+      for (int j = 0; j < server_polygon.vertex().size(); j++) {
+        lens::Polygon::Vertex server_vertex = server_polygon.vertex().at(j);
+        lens::mojom::VertexPtr mojo_vertex =
+            mojo_polygon->vertex.at(j)->Clone();
+        EXPECT_EQ(server_vertex.x(), mojo_vertex->x);
+        EXPECT_EQ(server_vertex.y(), mojo_vertex->y);
+      }
+      EXPECT_EQ(static_cast<int>(server_polygon.vertex_ordering()),
+                static_cast<int>(mojo_polygon->vertex_ordering));
+      EXPECT_EQ(static_cast<int>(server_polygon.coordinate_type()),
+                static_cast<int>(mojo_polygon->coordinate_type));
+    }
   }
 
   void VerifyOverlayObjectsAreEqual(
@@ -147,7 +190,7 @@
       lens::OverlayObject server_object = server_objects.at(i);
       lens::mojom::OverlayObjectPtr mojo_object = mojo_objects.at(i)->Clone();
       EXPECT_EQ(server_object.id(), mojo_object->id);
-      VerifiyGeometryDimensionsAreEqual(server_object.geometry(),
+      VerifyGeometriesAreEqual(server_object.geometry(),
                                         std::move(mojo_object->geometry));
     }
   }
@@ -157,7 +200,7 @@
        CreateObjectsMojomArrayFromServerResponse) {
   std::vector<lens::OverlayObject> server_objects = {
       CreateServerOverlayObject(kTestBoundingBox1),
-      CreateServerOverlayObject(kTestBoundingBox2)};
+      CreateServerOverlayObjectWithPolygon(kTestBoundingBox2)};
   lens::LensOverlayServerResponse server_response =
       CreateLensServerOverlayResponse(server_objects);
 
@@ -212,14 +255,14 @@
   EXPECT_TRUE(mojo_paragraph->writing_direction.has_value());
   EXPECT_EQ(static_cast<int>(mojo_paragraph->writing_direction.value()),
             static_cast<int>(kTestText.writing_direction));
-  VerifiyGeometryDimensionsAreEqual(server_paragraph.geometry(),
+  VerifyGeometriesAreEqual(server_paragraph.geometry(),
                                     mojo_paragraph->geometry->Clone());
 
   // Compare line for a paragraph.
   EXPECT_EQ(mojo_paragraph->lines.size(), static_cast<unsigned long>(1));
   lens::TextLayout_Line server_line = server_paragraph.lines()[0];
   lens::mojom::LinePtr mojo_line = mojo_paragraph->lines[0]->Clone();
-  VerifiyGeometryDimensionsAreEqual(server_line.geometry(),
+  VerifyGeometriesAreEqual(server_line.geometry(),
                                     mojo_line->geometry->Clone());
 
   // Compare words in line.
@@ -228,7 +271,7 @@
   EXPECT_EQ(mojo_word->plain_text, kTestText.word_plain_text);
   EXPECT_EQ(mojo_word->text_separator, kTestText.word_text_seperator);
   lens::TextLayout_Word server_word = server_line.words()[0];
-  VerifiyGeometryDimensionsAreEqual(server_word.geometry(),
+  VerifyGeometriesAreEqual(server_word.geometry(),
                                     mojo_word->geometry->Clone());
   EXPECT_TRUE(mojo_word->writing_direction.has_value());
   EXPECT_EQ(static_cast<int>(mojo_word->writing_direction.value()),
diff --git a/chrome/browser/platform_experience/win b/chrome/browser/platform_experience/win
index 8d47ead..bb7b461 160000
--- a/chrome/browser/platform_experience/win
+++ b/chrome/browser/platform_experience/win
@@ -1 +1 @@
-Subproject commit 8d47eadc639188d06f1ece609096a8e06cb1aae0
+Subproject commit bb7b46198c60bc9af0b1b5b063396befa4dbe0a1
diff --git a/chrome/browser/resources/lens/overlay/BUILD.gn b/chrome/browser/resources/lens/overlay/BUILD.gn
index 42640bd..7f5bd683 100644
--- a/chrome/browser/resources/lens/overlay/BUILD.gn
+++ b/chrome/browser/resources/lens/overlay/BUILD.gn
@@ -50,6 +50,7 @@
     "$root_gen_dir/chrome/browser/lens/core/mojom/lens.mojom-webui.ts",
     "$root_gen_dir/chrome/browser/lens/core/mojom/text.mojom-webui.ts",
     "$root_gen_dir/chrome/browser/lens/core/mojom/overlay_object.mojom-webui.ts",
+    "$root_gen_dir/chrome/browser/lens/core/mojom/polygon.mojom-webui.ts",
     "$root_gen_dir/chrome/browser/lens/core/mojom/geometry.mojom-webui.ts",
   ]
 
diff --git a/chrome/browser/resources/lens/overlay/object_layer.html b/chrome/browser/resources/lens/overlay/object_layer.html
index 7ae3bef..1763b6e8 100644
--- a/chrome/browser/resources/lens/overlay/object_layer.html
+++ b/chrome/browser/resources/lens/overlay/object_layer.html
@@ -9,7 +9,18 @@
     border: 2px solid green;
     opacity: 50%;
   }
+
+  #objectSelectionCanvas {
+    top: 0;
+    left: 0;
+    position: absolute;
+    pointer-events: none;
+  }
 </style>
+<canvas id="objectSelectionCanvas" height="[[canvasHeight]]"
+  width="[[canvasWidth]]"></canvas>
 <template id="objectsContainer" is="dom-repeat" items="[[renderedObjects]]">
-  <div style$="[[getObjectStyle(item)]]" class="object"></div>
+  <div style$="[[getObjectStyle(item)]]" class="object"
+    on-pointerenter="handlePointerEnter" on-pointerleave="handlePointerLeave">
+  </div>
 </template>
diff --git a/chrome/browser/resources/lens/overlay/object_layer.ts b/chrome/browser/resources/lens/overlay/object_layer.ts
index a93e82a..285d9f38 100644
--- a/chrome/browser/resources/lens/overlay/object_layer.ts
+++ b/chrome/browser/resources/lens/overlay/object_layer.ts
@@ -4,7 +4,7 @@
 
 import './strings.m.js';
 
-import {assert} from '//resources/js/assert.js';
+import {assert, assertInstanceof} from '//resources/js/assert.js';
 import {loadTimeData} from '//resources/js/load_time_data.js';
 import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import type {DomRepeat} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -15,6 +15,7 @@
 import type {LensPageCallbackRouter} from './lens.mojom-webui.js';
 import {getTemplate} from './object_layer.html.js';
 import type {OverlayObject} from './overlay_object.mojom-webui.js';
+import {Polygon_CoordinateType} from './polygon.mojom-webui.js';
 import type {PostSelectionBoundingBox} from './post_selection_renderer.js';
 import type {GestureEvent} from './selection_utils.js';
 
@@ -65,6 +66,7 @@
 export interface ObjectLayerElement {
   $: {
     objectsContainer: DomRepeat,
+    objectSelectionCanvas: HTMLCanvasElement,
   };
 }
 
@@ -82,6 +84,8 @@
 
   static get properties() {
     return {
+      canvasHeight: Number,
+      canvasWidth: Number,
       renderedObjects: {
         type: Array,
         value: () => [],
@@ -94,6 +98,9 @@
     };
   }
 
+  private canvasHeight: number;
+  private canvasWidth: number;
+  private context: CanvasRenderingContext2D;
   // The objects rendered in this layer.
   private renderedObjects: OverlayObject[];
 
@@ -101,6 +108,12 @@
       BrowserProxyImpl.getInstance().callbackRouter;
   private objectsReceivedListenerId: number|null = null;
 
+  override ready() {
+    super.ready();
+
+    this.context = this.$.objectSelectionCanvas.getContext('2d')!;
+  }
+
   override connectedCallback() {
     super.connectedCallback();
 
@@ -141,6 +154,76 @@
     return true;
   }
 
+  private handlePointerEnter(event: PointerEvent) {
+    assertInstanceof(event.target, HTMLElement);
+    const object =
+      this.$.objectsContainer.itemForElement(event.target);
+    this.drawObject(object);
+  }
+
+  private handlePointerLeave() {
+    this.clearCanvas();
+  }
+
+  setCanvasSizeTo(width: number, height: number) {
+    // Resetting the canvas width and height also clears the canvas.
+    this.canvasWidth = width;
+    this.canvasHeight = height;
+  }
+
+  private drawObject(object: OverlayObject) {
+    const polygons = object.geometry.segmentationPolygon;
+    if (!polygons) {
+      return;
+    }
+    const objectBoundingBox = object.geometry.boundingBox;
+    // Fit a square around the bounding box to use for gradient coordinates.
+    const longestEdge =
+        Math.max(objectBoundingBox.box.width, objectBoundingBox.box.height);
+    const left = (objectBoundingBox.box.x - longestEdge / 2) * this.canvasWidth;
+    const top = (objectBoundingBox.box.y - longestEdge / 2) * this.canvasHeight;
+    const right =
+        (objectBoundingBox.box.x + longestEdge / 2) * this.canvasWidth;
+    const bottom =
+        (objectBoundingBox.box.y + longestEdge / 2) * this.canvasHeight;
+
+    this.context.beginPath();
+    for (const polygon of polygons) {
+      // TODO(b/330183480): Currently, we are assuming that polygon
+      // coordinates are normalized. We should still implement
+      // rendering in case this assumption is ever violated.
+      if (polygon.coordinateType !== Polygon_CoordinateType.kNormalized) {
+        continue;
+      }
+
+      const firstVertex = polygon.vertex[0];
+      this.context.moveTo(
+          firstVertex.x * this.canvasWidth, firstVertex.y * this.canvasHeight);
+      for (const vertex of polygon.vertex.slice(1)) {
+        this.context.lineTo(
+            vertex.x * this.canvasWidth, vertex.y * this.canvasHeight);
+      }
+    }
+
+    this.context.lineCap = 'round';
+    this.context.lineJoin = 'round';
+    this.context.lineWidth = 4;
+    const gradient = this.context.createLinearGradient(
+        left,
+        top,
+        right,
+        bottom,
+    );
+    gradient.addColorStop(0, '#0177DC');
+    gradient.addColorStop(1, '#D5E3FF');
+    this.context.strokeStyle = gradient;
+    this.context.stroke();
+  }
+
+  private clearCanvas() {
+    this.context.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
+  }
+
   private onObjectsReceived(objects: OverlayObject[]) {
     // Sort objects by descending bounding box areas so that smaller objects
     // are rendered over, and take priority over, larger objects.
diff --git a/chrome/browser/resources/lens/overlay/selection_overlay.ts b/chrome/browser/resources/lens/overlay/selection_overlay.ts
index e0fc7489..0deba9c 100644
--- a/chrome/browser/resources/lens/overlay/selection_overlay.ts
+++ b/chrome/browser/resources/lens/overlay/selection_overlay.ts
@@ -226,6 +226,8 @@
         this.$.selectionOverlay.getBoundingClientRect();
     this.$.regionSelectionLayer.setCanvasSizeTo(
         selectionOverlayBounds.width, selectionOverlayBounds.height);
+    this.$.objectSelectionLayer.setCanvasSizeTo(
+        selectionOverlayBounds.width, selectionOverlayBounds.height);
   }
 
   // Updates the currentGesture to correspond with the given PointerEvent.
diff --git a/chrome/browser/resources/side_panel/read_anything/language_menu.html b/chrome/browser/resources/side_panel/read_anything/language_menu.html
index f303edf2..e4461b1 100644
--- a/chrome/browser/resources/side_panel/read_anything/language_menu.html
+++ b/chrome/browser/resources/side_panel/read_anything/language_menu.html
@@ -4,7 +4,7 @@
       width: auto;
       margin-left: var(--sp-body-padding);
       margin-right: var(--sp-body-padding);
-      height: 60%;
+      height: fit-content;
     }
 
     cr-icon {
@@ -60,6 +60,7 @@
     }
 
     .language-menu-body {
+      height: 50vh;
       padding-bottom: 16px;
     }
 
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts b/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts
index b82a416f9..513fa1db 100644
--- a/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts
+++ b/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts
@@ -166,8 +166,8 @@
     // Called when the voice used for speech is changed via the webui toolbar.
     function onVoiceChange(voice: string, lang: string): void;
 
-    // Called when a language is enabled/disabled for via the webui language
-    // menu.
+    // Called when a language is enabled/disabled for Read Aloud
+    // via the webui language menu.
     function onLanguagePrefChange(lang: string, enabled: boolean): void;
 
     // Called when the highlight granularity is changed via the webui toolbar.
diff --git a/chrome/browser/resources/side_panel/reading_list/BUILD.gn b/chrome/browser/resources/side_panel/reading_list/BUILD.gn
index 504b7ee..5340e1a 100644
--- a/chrome/browser/resources/side_panel/reading_list/BUILD.gn
+++ b/chrome/browser/resources/side_panel/reading_list/BUILD.gn
@@ -21,7 +21,10 @@
   ]
 
   non_web_component_files = [ "reading_list_api_proxy.ts" ]
-  css_files = [ "reading_list_item.css" ]
+  css_files = [
+    "reading_list_app.css",
+    "reading_list_item.css",
+  ]
 
   icons_html_files = [ "icons.html" ]
 
@@ -31,6 +34,7 @@
   html_to_wrapper_template = "detect"
   ts_composite = true
   ts_deps = [
+    "../shared:build_ts",
     "//third_party/lit/v3_0:build_ts",
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_components/color_change_listener:build_ts",
@@ -39,6 +43,11 @@
     "//ui/webui/resources/js:build_ts",
     "//ui/webui/resources/mojo:build_ts",
   ]
+  ts_path_mappings =
+      [ "chrome://read-later.top-chrome/shared/*|" +
+        rebase_path(
+            "$root_gen_dir/chrome/browser/resources/side_panel/shared/tsc/*",
+            target_gen_dir) ]
   ts_definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
 
   webui_context_type = "trusted"
diff --git a/chrome/browser/resources/side_panel/reading_list/icons.html b/chrome/browser/resources/side_panel/reading_list/icons.html
index e70cc8d9..accc5ab 100644
--- a/chrome/browser/resources/side_panel/reading_list/icons.html
+++ b/chrome/browser/resources/side_panel/reading_list/icons.html
@@ -1,4 +1,4 @@
-<iron-iconset-svg name="read-later" size="24">
+<cr-iconset name="read-later" size="24">
   <svg>
     <defs>
       <!-- Material icons -->
@@ -7,4 +7,4 @@
         </path>
       </g>
     </defs>
-</iron-iconset-svg>
\ No newline at end of file
+</cr-iconset>
diff --git a/chrome/browser/resources/side_panel/reading_list/reading_list.html b/chrome/browser/resources/side_panel/reading_list/reading_list.html
index 64287dce..0343662 100644
--- a/chrome/browser/resources/side_panel/reading_list/reading_list.html
+++ b/chrome/browser/resources/side_panel/reading_list/reading_list.html
@@ -17,7 +17,6 @@
 <body>
   <reading-list-app></reading-list-app>
   <script type="module" src="reading_list_app.js"></script>
-  <script type="module" src="chrome://resources/cr_elements/mwb_shared_vars.css.js">
   </script>
 </body>
 </html>
diff --git a/chrome/browser/resources/side_panel/reading_list/reading_list_app.css b/chrome/browser/resources/side_panel/reading_list/reading_list_app.css
new file mode 100644
index 0000000..35e57c0
--- /dev/null
+++ b/chrome/browser/resources/side_panel/reading_list/reading_list_app.css
@@ -0,0 +1,35 @@
+/* Copyright 2024 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #import=chrome://read-later.top-chrome/shared/sp_shared_style_lit.css.js
+ * #import=chrome://resources/cr_elements/cr_hidden_style_lit.css.js
+ * #import=chrome://resources/cr_elements/mwb_element_shared_style_lit.css.js
+ * #scheme=relative
+ * #include=mwb-element-shared-style-lit cr-hidden-style-lit sp-shared-style-lit
+ * #css_wrapper_metadata_end */
+
+#content {
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+}
+
+/* Transition required to ensure focus highlight after button press.
+ * See crbug/1358900.
+ */
+reading-list-item:first-of-type:last-of-type {
+  transition: background 100ms;
+}
+
+#readingListList {
+  max-height: none;
+  overflow: auto;
+  padding-block-start: var(--sp-body-padding);
+}
+
+sp-heading {
+  margin: 8px 16px;
+}
diff --git a/chrome/browser/resources/side_panel/reading_list/reading_list_app.html b/chrome/browser/resources/side_panel/reading_list/reading_list_app.html
index 9f91bda6..f818500 100644
--- a/chrome/browser/resources/side_panel/reading_list/reading_list_app.html
+++ b/chrome/browser/resources/side_panel/reading_list/reading_list_app.html
@@ -1,79 +1,51 @@
-<style include="mwb-element-shared-style cr-hidden-style sp-shared-style">
-  #content {
-    display: flex;
-    flex-direction: column;
-    height: 100vh;
-  }
-
-  /* Transition required to ensure focus highlight after button press.
-   * See crbug/1358900.
-   */
-  reading-list-item:first-of-type:last-of-type {
-    transition: background 100ms;
-  }
-
-  #readingListList {
-    max-height: none;
-    overflow: auto;
-    padding-block-start: var(--sp-body-padding);
-  }
-
-  sp-heading {
-    margin: 8px 16px;
-  }
-</style>
-
-<div id="content" hidden="[[loadingContent_]]">
+<div id="content" ?hidden="${this.loadingContent_}">
   <sp-empty-state
-      hidden="[[!isReadingListEmpty_(unreadItems_, readItems_)]]"
+      ?hidden="${!this.isReadingListEmpty_()}"
       image-path="./images/read_later_empty.svg"
       dark-image-path="./images/read_later_empty_dark.svg"
       heading="$i18n{emptyStateHeader}"
-      body="[[getEmptyStateSubheaderText_()]]">
+      body="${this.getEmptyStateSubheaderText_()}">
   </sp-empty-state>
   <div id="readingListList" class="sp-scroller sp-scroller-top-of-page"
-      on-keydown="onItemKeyDown_"
-      hidden$="[[!shouldShowList_(unreadItems_, readItems_)]]">
-    <div class="sp-card" hidden="[[!unreadItems_.length]]">
+      @keydown="${this.onItemKeyDown_}"
+      ?hidden="${!this.shouldShowList_()}">
+    <div class="sp-card" ?hidden="${!this.unreadItems_.length}">
       <sp-heading compact hide-back-button>
         <h2 slot="heading">$i18n{unreadHeader}</h2>
       </sp-heading>
-      <template id="unreadItemsList" is="dom-repeat" items="[[unreadItems_]]">
-        <reading-list-item data-url$="[[item.url.url]]" on-focus="onItemFocus_"
-            aria-label="[[ariaLabel_(item)]]" class="unread-item"
-            data="[[item]]" button-ripples="[[buttonRipples]]">
+      ${this.unreadItems_.map((item, index) => html`
+        <reading-list-item data-url="${item.url.url}" data-index="${index}"
+            @focus="${this.onItemFocus_}"
+            aria-label="${this.ariaLabel_(item)}" class="unread-item"
+            .data="${item}" ?button-ripples="${this.buttonRipples}">
         </reading-list-item>
-      </template>
+      `)}
     </div>
-    <div class="sp-cards-separator"
-        hidden$="[[!shouldShowHr_(unreadItems_, readItems_)]]">
-    </div>
-    <div class="sp-card" hidden="[[!readItems_.length]]">
+    <div class="sp-cards-separator" ?hidden="${!this.shouldShowHr_()}"></div>
+    <div class="sp-card" ?hidden="${!this.readItems_.length}">
       <sp-heading compact hide-back-button>
         <h2 slot="heading">$i18n{readHeader}</h2>
       </sp-heading>
-      <template id="readItemsList" is="dom-repeat" items="[[readItems_]]">
-        <reading-list-item data-url$="[[item.url.url]]" on-focus="onItemFocus_"
-            aria-label="[[ariaLabel_(item)]]"
-            data="[[item]]" button-ripples="[[buttonRipples]]">
+      ${this.readItems_.map((item, index) => html`
+        <reading-list-item data-url="${item.url.url}" data-index="${index}"
+            @focus="${this.onItemFocus_}"
+            aria-label="${this.ariaLabel_(item)}"
+            .data="${item}" ?button-ripples="${this.buttonRipples}">
         </reading-list-item>
-      </template>
+      `)}
     </div>
   </div>
-  <sp-footer pinned="[[!isReadingListEmpty_(unreadItems_, readItems_)]]">
+  <sp-footer ?pinned="${!this.isReadingListEmpty_()}">
     <cr-button id="currentPageActionButton" class="floating-button"
-        aria-label="[[getCurrentPageActionButtonText_(
-            currentPageActionButtonState_)]]"
-        on-click="onCurrentPageActionButtonClick_"
-        disabled="[[getCurrentPageActionButtonDisabled_(
-            currentPageActionButtonState_)]]">
-      <iron-icon id="currentPageActionButtonIcon" aria-hidden="true"
+        aria-label="${this.getCurrentPageActionButtonText_()}"
+        @click="${this.onCurrentPageActionButtonClick_}"
+        ?disabled="${this.getCurrentPageActionButtonDisabled_()}">
+      <cr-icon id="currentPageActionButtonIcon" aria-hidden="true"
           slot="prefix-icon"
-          icon="[[getCurrentPageActionButtonIcon_(
-              currentPageActionButtonState_)]]">
-      </iron-icon>
+          icon="${this.getCurrentPageActionButtonIcon_()}">
+      </cr-icon>
       <div id="currentPageActionButtonText" aria-hidden="true">
-        [[getCurrentPageActionButtonText_(currentPageActionButtonState_)]]
+        ${this.getCurrentPageActionButtonText_()}
       </div>
     </cr-button>
   </sp-footer>
diff --git a/chrome/browser/resources/side_panel/reading_list/reading_list_app.ts b/chrome/browser/resources/side_panel/reading_list/reading_list_app.ts
index 4f12b20..995d81a 100644
--- a/chrome/browser/resources/side_panel/reading_list/reading_list_app.ts
+++ b/chrome/browser/resources/side_panel/reading_list/reading_list_app.ts
@@ -7,47 +7,36 @@
 import 'chrome://read-later.top-chrome/shared/sp_heading.js';
 import 'chrome://read-later.top-chrome/shared/sp_shared_style.css.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
-import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
-import 'chrome://resources/cr_elements/cr_hidden_style.css.js';
-import 'chrome://resources/cr_elements/cr_shared_vars.css.js';
-import 'chrome://resources/cr_elements/mwb_element_shared_style.css.js';
-import 'chrome://resources/cr_elements/mwb_shared_style.css.js';
-import 'chrome://resources/cr_elements/mwb_shared_vars.css.js';
-import 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js';
+import 'chrome://resources/cr_elements/cr_icon/cr_icon.js';
+import 'chrome://resources/cr_elements/icons_lit.html.js';
 import './reading_list_item.js';
 import '../strings.m.js';
 
 import {ColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
-import type {HelpBubbleMixinInterface} from 'chrome://resources/cr_components/help_bubble/help_bubble_mixin.js';
-import {HelpBubbleMixin} from 'chrome://resources/cr_components/help_bubble/help_bubble_mixin.js';
+import {HelpBubbleMixinLit} from 'chrome://resources/cr_components/help_bubble/help_bubble_mixin_lit.js';
+import {CrSelectableMixin} from 'chrome://resources/cr_elements/cr_menu_selector/cr_selectable_mixin.js';
 import {assertNotReached} from 'chrome://resources/js/assert.js';
 import {EventTracker} from 'chrome://resources/js/event_tracker.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
-import {listenOnce} from 'chrome://resources/js/util.js';
-import {IronSelectableBehavior} from 'chrome://resources/polymer/v3_0/iron-selector/iron-selectable.js';
-import type {DomRepeat} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js';
 
-import {getTemplate} from './reading_list_app.html.js';
 import type {ReadLaterEntriesByStatus, ReadLaterEntry} from './reading_list.mojom-webui.js';
 import {CurrentPageActionButtonState} from './reading_list.mojom-webui.js';
 import type {ReadingListApiProxy} from './reading_list_api_proxy.js';
 import {ReadingListApiProxyImpl} from './reading_list_api_proxy.js';
+import {getCss} from './reading_list_app.css.js';
+import {getHtml} from './reading_list_app.html.js';
 import type {ReadingListItemElement} from './reading_list_item.js';
 import {MARKED_AS_READ_UI_EVENT} from './reading_list_item.js';
 
 const navigationKeys: Set<string> = new Set(['ArrowDown', 'ArrowUp']);
 
-const ReadingListAppElementBase = mixinBehaviors(
-                                      [IronSelectableBehavior],
-                                      HelpBubbleMixin(PolymerElement)) as {
-  new (): PolymerElement & HelpBubbleMixinInterface & IronSelectableBehavior,
-};
+const ReadingListAppElementBase =
+    HelpBubbleMixinLit(CrSelectableMixin(CrLitElement));
 
 export interface ReadingListAppElement {
   $: {
     readingListList: HTMLElement,
-    unreadItemsList: DomRepeat,
   };
 }
 
@@ -61,50 +50,30 @@
     return 'reading-list-app';
   }
 
-  static get template() {
-    return getTemplate();
+  static override get styles() {
+    return getCss();
   }
 
-  static get properties() {
+  override render() {
+    return getHtml.bind(this)();
+  }
+
+  static override get properties() {
     return {
-      /** Property for IronSelectableBehavior */
-      attrForSelected: {
-        type: String,
-        value: 'data-url',
-      },
-
-      unreadItems_: {
-        type: Array,
-        value: [],
-      },
-
-      readItems_: {
-        type: Array,
-        value: [],
-      },
-
-      currentPageActionButtonState_: {
-        type: Number,
-        value: CurrentPageActionButtonState.kDisabled,
-      },
-
-      buttonRipples: {
-        type: Boolean,
-        value: () => loadTimeData.getBoolean('useRipples'),
-      },
-
-      loadingContent_: {
-        type: Boolean,
-        value: true,
-      },
+      unreadItems_: {type: Array},
+      readItems_: {type: Array},
+      currentPageActionButtonState_: {type: Number},
+      buttonRipples: {type: Boolean},
+      loadingContent_: {type: Boolean},
     };
   }
 
-  private unreadItems_: ReadLaterEntry[];
-  private readItems_: ReadLaterEntry[];
-  private currentPageActionButtonState_: CurrentPageActionButtonState;
-  buttonRipples: boolean;
-  private loadingContent_: boolean;
+  protected unreadItems_: ReadLaterEntry[] = [];
+  protected readItems_: ReadLaterEntry[] = [];
+  private currentPageActionButtonState_: CurrentPageActionButtonState =
+      CurrentPageActionButtonState.kDisabled;
+  buttonRipples: boolean = loadTimeData.getBoolean('useRipples');
+  protected loadingContent_: boolean = true;
   private apiProxy_: ReadingListApiProxy =
       ReadingListApiProxyImpl.getInstance();
   private listenerIds_: number[] = [];
@@ -115,6 +84,9 @@
     super();
     ColorChangeUpdater.forDocument().start();
 
+    /** Property for CrSelectableMixin */
+    this.attrForSelected = 'data-url';
+
     this.visibilityChangedListener_ = () => {
       // Refresh Reading List's list data when transitioning into a visible
       // state.
@@ -133,7 +105,8 @@
     const callbackRouter = this.apiProxy_.getCallbackRouter();
     this.listenerIds_.push(
         callbackRouter.itemsChanged.addListener(
-            (entries: ReadLaterEntriesByStatus) => this.updateItems_(entries)),
+            (entries: ReadLaterEntriesByStatus) =>
+                this.updateReadingListItems_(entries)),
         callbackRouter.currentPageActionButtonStateChanged.addListener(
             (state: CurrentPageActionButtonState) =>
                 this.updateCurrentPageActionButton_(state)));
@@ -142,7 +115,8 @@
     this.apiProxy_.updateCurrentPageActionButtonState();
 
     this.readingListEventTracker_.add(
-        this.root!, MARKED_AS_READ_UI_EVENT, this.onMarkedAsRead.bind(this));
+        this.shadowRoot!, MARKED_AS_READ_UI_EVENT,
+        this.onMarkedAsRead_.bind(this));
   }
 
   override disconnectedCallback() {
@@ -156,28 +130,28 @@
 
     this.unregisterHelpBubble(READING_LIST_UNREAD_ELEMENT_ID);
 
-    this.readingListEventTracker_.remove(this.root!, MARKED_AS_READ_UI_EVENT);
+    this.readingListEventTracker_.remove(
+        this.shadowRoot!, MARKED_AS_READ_UI_EVENT);
   }
 
-  override ready() {
-    super.ready();
-
+  override firstUpdated() {
     this.registerHelpBubble(
         ADD_CURRENT_TAB_ELEMENT_ID, '#currentPageActionButton');
 
-    this.$.unreadItemsList.addEventListener(
-        'rendered-item-count-changed', () => {
-          const firstUnreadItem =
-              this.root!.querySelector<HTMLElement>('.unread-item');
-          if (firstUnreadItem) {
-            this.registerHelpBubble(
-                READING_LIST_UNREAD_ELEMENT_ID, firstUnreadItem);
-          }
-        });
+    const firstUnreadItem =
+        this.shadowRoot!.querySelector<HTMLElement>('.unread-item');
+    if (firstUnreadItem) {
+      this.registerHelpBubble(READING_LIST_UNREAD_ELEMENT_ID, firstUnreadItem);
+    }
   }
 
-  /** Overridden from IronSelectableBehavior to allow nested items. */
-  override get items() {
+  // Override `observeItems` from CrSelectableMixin.
+  override observeItems() {
+    // Turn off default observation logic in CrSelectableMixin.
+  }
+
+  // Override `queryItems` from CrSelectableMixin.
+  override queryItems() {
     return Array.from(this.shadowRoot!.querySelectorAll('reading-list-item'));
   }
 
@@ -193,31 +167,26 @@
         'ReadingList.WebUI.ReadingListDataReceived',
         Math.round(Date.now() - getEntriesStartTimestamp));
 
-    if (entries.unreadEntries.length !== 0 ||
-        entries.readEntries.length !== 0) {
-      listenOnce(this.$.readingListList, 'dom-change', () => {
-        // Push ShowUI() callback to the event queue to allow deferred rendering
-        // to take place.
-        setTimeout(() => this.apiProxy_.showUi(), 0);
-      });
-    } else {
-      setTimeout(() => this.apiProxy_.showUi(), 0);
-    }
-
-    this.updateItems_(entries);
+    // Push ShowUI() callback to the event queue to allow deferred rendering
+    // to take place.
+    setTimeout(() => this.apiProxy_.showUi(), 0);
+    this.updateReadingListItems_(entries);
   }
 
-  private updateItems_(entries: ReadLaterEntriesByStatus) {
+  private async updateReadingListItems_(entries: ReadLaterEntriesByStatus) {
     this.unreadItems_ = entries.unreadEntries;
     this.readItems_ = entries.readEntries;
     this.loadingContent_ = false;
+
+    await this.updateComplete;
+    this.itemsChanged();
   }
 
   private updateCurrentPageActionButton_(state: CurrentPageActionButtonState) {
     this.currentPageActionButtonState_ = state;
   }
 
-  private ariaLabel_(item: ReadLaterEntry): string {
+  protected ariaLabel_(item: ReadLaterEntry): string {
     return `${item.title} - ${item.displayUrl} - ${
         item.displayTimeSinceUpdate}`;
   }
@@ -225,36 +194,30 @@
   /**
    * @return The appropriate text for the empty state subheader
    */
-  private getEmptyStateSubheaderText_(): string {
+  protected getEmptyStateSubheaderText_(): string {
     return loadTimeData.getString('emptyStateAddFromDialogSubheader');
   }
 
   /**
    * @return The appropriate text for the current page action button
    */
-  private getCurrentPageActionButtonText_(): string {
-    if (this.getCurrentPageActionButtonMarkAsRead_()) {
-      return loadTimeData.getString('markCurrentTabAsRead');
-    } else {
-      return loadTimeData.getString('addCurrentTab');
-    }
+  protected getCurrentPageActionButtonText_(): string {
+    return loadTimeData.getString(
+        this.getCurrentPageActionButtonMarkAsRead_() ? 'markCurrentTabAsRead' :
+                                                       'addCurrentTab');
   }
 
   /**
    * @return The appropriate cr icon for the current page action button
    */
-  private getCurrentPageActionButtonIcon_(): string {
-    if (this.getCurrentPageActionButtonMarkAsRead_()) {
-      return 'cr:check';
-    } else {
-      return 'cr:add';
-    }
+  protected getCurrentPageActionButtonIcon_(): string {
+    return this.getCurrentPageActionButtonMarkAsRead_() ? 'cr:check' : 'cr:add';
   }
 
   /**
    * @return Whether the current page action button should be disabled
    */
-  private getCurrentPageActionButtonDisabled_(): boolean {
+  protected getCurrentPageActionButtonDisabled_(): boolean {
     return this.currentPageActionButtonState_ ===
         CurrentPageActionButtonState.kDisabled;
   }
@@ -268,11 +231,11 @@
         CurrentPageActionButtonState.kMarkAsRead;
   }
 
-  private isReadingListEmpty_(): boolean {
+  protected isReadingListEmpty_(): boolean {
     return this.unreadItems_.length === 0 && this.readItems_.length === 0;
   }
 
-  private onCurrentPageActionButtonClick_() {
+  protected onCurrentPageActionButtonClick_() {
     if (this.getCurrentPageActionButtonMarkAsRead_()) {
       this.apiProxy_.markCurrentTabAsRead();
       this.sendTutorialCustomEvent();
@@ -281,7 +244,7 @@
     }
   }
 
-  private onMarkedAsRead() {
+  private onMarkedAsRead_() {
     this.sendTutorialCustomEvent();
   }
 
@@ -293,17 +256,19 @@
   }
 
 
-  private onItemKeyDown_(e: KeyboardEvent) {
+  protected async onItemKeyDown_(e: KeyboardEvent) {
     if (e.shiftKey || !navigationKeys.has(e.key)) {
       return;
     }
     switch (e.key) {
       case 'ArrowDown':
         this.selectNext();
+        await this.updateComplete;
         (this.selectedItem as ReadingListItemElement).focus();
         break;
       case 'ArrowUp':
         this.selectPrevious();
+        await this.updateComplete;
         (this.selectedItem as ReadingListItemElement).focus();
         break;
       default:
@@ -313,15 +278,15 @@
     e.stopPropagation();
   }
 
-  private onItemFocus_(e: Event) {
+  protected onItemFocus_(e: Event) {
     this.selected = (e.currentTarget as ReadingListItemElement).dataset['url']!;
   }
 
-  private shouldShowHr_(): boolean {
+  protected shouldShowHr_(): boolean {
     return this.unreadItems_.length > 0 && this.readItems_.length > 0;
   }
 
-  private shouldShowList_(): boolean {
+  protected shouldShowList_(): boolean {
     return this.unreadItems_.length > 0 || this.readItems_.length > 0;
   }
 }
diff --git a/chrome/browser/resources/side_panel/reading_list/reading_list_item.ts b/chrome/browser/resources/side_panel/reading_list/reading_list_item.ts
index fb412c2..fc31af0 100644
--- a/chrome/browser/resources/side_panel/reading_list/reading_list_item.ts
+++ b/chrome/browser/resources/side_panel/reading_list/reading_list_item.ts
@@ -4,7 +4,7 @@
 
 import 'chrome://resources/cr_elements/cr_url_list_item/cr_url_list_item.js';
 import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
-import 'chrome://resources/cr_elements/icons.html.js';
+import 'chrome://resources/cr_elements/icons_lit.html.js';
 import './icons.html.js';
 
 import type {CrUrlListItemElement} from 'chrome://resources/cr_elements/cr_url_list_item/cr_url_list_item.js';
diff --git a/chrome/browser/resources/side_panel/shared/BUILD.gn b/chrome/browser/resources/side_panel/shared/BUILD.gn
index 96befffd..67cdec1 100644
--- a/chrome/browser/resources/side_panel/shared/BUILD.gn
+++ b/chrome/browser/resources/side_panel/shared/BUILD.gn
@@ -18,14 +18,20 @@
   ]
 
   css_files = [
-    "sp_shared_vars.css",
+    "sp_empty_state.css",
+    "sp_footer.css",
     "sp_shared_style.css",
+    "sp_shared_style_lit.css",
+    "sp_shared_vars.css",
   ]
 
   icons_html_files = [ "sp_icons.html" ]
 
+  html_to_wrapper_template = "detect"
+
   ts_composite = true
   ts_deps = [
+    "//third_party/lit/v3_0:build_ts",
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
diff --git a/chrome/browser/resources/side_panel/shared/sp_empty_state.css b/chrome/browser/resources/side_panel/shared/sp_empty_state.css
new file mode 100644
index 0000000..a7668d5
--- /dev/null
+++ b/chrome/browser/resources/side_panel/shared/sp_empty_state.css
@@ -0,0 +1,43 @@
+/* Copyright 2024 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #import=//resources/cr_elements/cr_shared_vars.css.js
+ * #scheme=relative
+ * #css_wrapper_metadata_end */
+
+:host {
+  align-items: center;
+  display: flex;
+  flex-direction: column;
+  text-align: center;
+}
+
+picture {
+  align-items: center;
+  display: flex;
+  height: 144px;
+  justify-content: center;
+  width: 288px;
+  margin-block-end: 12px;
+}
+
+#heading {
+  color: var(--sp-empty-state-heading-color, var(--cr-primary-text-color));
+  font-size: 16px;
+  font-weight: 500;
+  line-height: 24px;
+  margin-block-end: 8px;
+  width: 259px;
+}
+
+#body {
+  color: var(--sp-empty-state-body-color, var(--cr-secondary-text-color));
+  font-size: 13px;
+  font-weight: 400;
+  line-height: 20px;
+  margin-block-end: 12px;
+  width: 229px;
+}
diff --git a/chrome/browser/resources/side_panel/shared/sp_empty_state.html b/chrome/browser/resources/side_panel/shared/sp_empty_state.html
index 11b9b2cc..1034bb8 100644
--- a/chrome/browser/resources/side_panel/shared/sp_empty_state.html
+++ b/chrome/browser/resources/side_panel/shared/sp_empty_state.html
@@ -1,42 +1,6 @@
-<style>
-  :host {
-    align-items: center;
-    display: flex;
-    flex-direction: column;
-    text-align: center;
-  }
-
-  picture {
-    align-items: center;
-    display: flex;
-    height: 144px;
-    justify-content: center;
-    width: 288px;
-    margin-block-end: 12px;
-  }
-
-  #heading {
-    color: var(--sp-empty-state-heading-color, var(--cr-primary-text-color));
-    font-size: 16px;
-    font-weight: 500;
-    line-height: 24px;
-    margin-block-end: 8px;
-    width: 259px;
-  }
-
-  #body {
-    color: var(--sp-empty-state-body-color, var(--cr-secondary-text-color));
-    font-size: 13px;
-    font-weight: 400;
-    line-height: 20px;
-    margin-block-end: 12px;
-    width: 229px;
-  }
-</style>
-
 <picture>
-  <source media="(prefers-color-scheme: dark)" srcset="[[darkImagePath]]">
-  <img id="product-logo" srcset="[[imagePath]]" alt="">
+  <source media="(prefers-color-scheme: dark)" srcset="${this.darkImagePath}">
+  <img id="product-logo" srcset="${this.imagePath}" alt="">
 </picture>
-<div id="heading">[[heading]]</div>
-<div id="body">[[body]]</div>
+<div id="heading">${this.heading}</div>
+<div id="body">${this.body}</div>
diff --git a/chrome/browser/resources/side_panel/shared/sp_empty_state.ts b/chrome/browser/resources/side_panel/shared/sp_empty_state.ts
index cd89294..6854078e 100644
--- a/chrome/browser/resources/side_panel/shared/sp_empty_state.ts
+++ b/chrome/browser/resources/side_panel/shared/sp_empty_state.ts
@@ -6,27 +6,30 @@
  * @fileoverview Shared styles for showing an empty state for a side panel UI.
  */
 
-import '//resources/cr_elements/cr_shared_vars.css.js';
+import {CrLitElement} from '//resources/lit/v3_0/lit.rollup.js';
 
-import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getCss} from './sp_empty_state.css.js';
+import {getHtml} from './sp_empty_state.html.js';
 
-import {getTemplate} from './sp_empty_state.html.js';
-
-export class SpEmptyStateElement extends PolymerElement {
+export class SpEmptyStateElement extends CrLitElement {
   static get is() {
     return 'sp-empty-state';
   }
 
-  static get template() {
-    return getTemplate();
+  static override get styles() {
+    return getCss();
   }
 
-  static get properties() {
+  override render() {
+    return getHtml.bind(this)();
+  }
+
+  static override get properties() {
     return {
-      body: String,
-      darkImagePath: String,
-      heading: String,
-      imagePath: String,
+      body: {type: String},
+      darkImagePath: {type: String},
+      heading: {type: String},
+      imagePath: {type: String},
     };
   }
 
diff --git a/chrome/browser/resources/side_panel/shared/sp_footer.css b/chrome/browser/resources/side_panel/shared/sp_footer.css
new file mode 100644
index 0000000..4b7c9ab5
--- /dev/null
+++ b/chrome/browser/resources/side_panel/shared/sp_footer.css
@@ -0,0 +1,24 @@
+/* Copyright 2024 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #scheme=relative
+ * #css_wrapper_metadata_end */
+
+:host {
+  display: flex;
+  justify-content: center;
+}
+
+:host([pinned]) {
+  border-top: 0;
+  box-sizing: border-box;
+  display: block;
+  flex-shrink: 0;
+  height: 56px;
+  margin-block-start: auto;
+  padding: 8px;
+  position: relative;
+}
diff --git a/chrome/browser/resources/side_panel/shared/sp_footer.html b/chrome/browser/resources/side_panel/shared/sp_footer.html
index de08037..40faa62 100644
--- a/chrome/browser/resources/side_panel/shared/sp_footer.html
+++ b/chrome/browser/resources/side_panel/shared/sp_footer.html
@@ -1,18 +1,2 @@
-<style>
-  :host {
-    display: flex;
-    justify-content: center;
-  }
 
-  :host([pinned]) {
-    border-top: 0;
-    box-sizing: border-box;
-    display: block;
-    flex-shrink: 0;
-    height: 56px;
-    margin-block-start: auto;
-    padding: 8px;
-    position: relative;
-  }
-</style>
 <slot></slot>
diff --git a/chrome/browser/resources/side_panel/shared/sp_footer.ts b/chrome/browser/resources/side_panel/shared/sp_footer.ts
index 4d3ced1..2ffb562 100644
--- a/chrome/browser/resources/side_panel/shared/sp_footer.ts
+++ b/chrome/browser/resources/side_panel/shared/sp_footer.ts
@@ -9,33 +9,36 @@
 
 import '//resources/cr_elements/cr_shared_vars.css.js';
 
-import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {CrLitElement} from '//resources/lit/v3_0/lit.rollup.js';
 
-import {getTemplate} from './sp_footer.html.js';
+import {getCss} from './sp_footer.css.js';
+import {getHtml} from './sp_footer.html.js';
 
-export class SpFooterElement extends PolymerElement {
+export class SpFooterElement extends CrLitElement {
   static get is() {
     return 'sp-footer';
   }
 
-  static get template() {
-    return getTemplate();
+  static override get styles() {
+    return getCss();
   }
 
-  static get properties() {
+  override render() {
+    return getHtml.bind(this)();
+  }
+
+  static override get properties() {
     return {
       pinned: {
         type: Boolean,
-        reflectToAttribute: true,
-        value: false,
+        reflect: true,
       },
     };
   }
 
-  pinned: boolean;
+  pinned: boolean = false;
 
-  override ready() {
-    super.ready();
+  override firstUpdated() {
     this.setAttribute('role', 'toolbar');
   }
 }
diff --git a/chrome/browser/resources/side_panel/shared/sp_shared_style_lit.css b/chrome/browser/resources/side_panel/shared/sp_shared_style_lit.css
new file mode 100644
index 0000000..2690eca
--- /dev/null
+++ b/chrome/browser/resources/side_panel/shared/sp_shared_style_lit.css
@@ -0,0 +1,12 @@
+/* Copyright 2024 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #import=./sp_shared_vars.css.js
+ * #scheme=relative
+ * #css_wrapper_metadata_end */
+
+/* Purposefully empty since this style is generated at build time from the
+ * equivalent Polymer version. */
diff --git a/chrome/browser/resources/tab_search/tab_organization_group.ts b/chrome/browser/resources/tab_search/tab_organization_group.ts
index ce878fa..51093f0 100644
--- a/chrome/browser/resources/tab_search/tab_organization_group.ts
+++ b/chrome/browser/resources/tab_search/tab_organization_group.ts
@@ -152,7 +152,8 @@
   }
 
   private showNewTabSectionHeader_(index: number) {
-    return this.firstNewTabIndex > 0 && this.firstNewTabIndex === index;
+    return loadTimeData.getBoolean('tabReorganizationDividerEnabled') &&
+        this.firstNewTabIndex > 0 && this.firstNewTabIndex === index;
   }
 
   private onInputFocus_() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java
index 931b7d8..bb57e26 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java
@@ -9,7 +9,6 @@
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.ViewStub;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -53,6 +52,8 @@
 import org.chromium.components.omnibox.AutocompleteMatch;
 import org.chromium.components.omnibox.action.OmniboxActionDelegate;
 import org.chromium.components.omnibox.suggestions.OmniboxSuggestionUiType;
+import org.chromium.ui.AsyncViewProvider;
+import org.chromium.ui.AsyncViewStub;
 import org.chromium.ui.ViewProvider;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.modaldialog.ModalDialogManager;
@@ -177,26 +178,27 @@
     private ViewProvider<SuggestionListViewHolder> createViewProvider(
             Context context, MVCListAdapter.ModelList modelList, boolean forcePhoneStyleOmnibox) {
         return new ViewProvider<SuggestionListViewHolder>() {
+            private AsyncViewProvider<ViewGroup> mAsyncProvider;
             private List<Callback<SuggestionListViewHolder>> mCallbacks = new ArrayList<>();
             private SuggestionListViewHolder mHolder;
 
             @Override
             public void inflate() {
+                AsyncViewStub stub =
+                        mParent.getRootView().findViewById(R.id.omnibox_results_container_stub);
+                stub.setShouldInflateOnBackgroundThread(true);
+                mAsyncProvider = AsyncViewProvider.of(stub, R.id.omnibox_results_container);
+                mAsyncProvider.whenLoaded(this::onAsyncInflationComplete);
+                mAsyncProvider.inflate();
+            }
+
+            private void onAsyncInflationComplete(ViewGroup container) {
                 OmniboxSuggestionsDropdown dropdown =
                         new OmniboxSuggestionsDropdown(
                                 context, mRecycledViewPool, forcePhoneStyleOmnibox);
 
                 dropdown.setAdapter(mAdapter);
 
-                ViewGroup container =
-                        (ViewGroup)
-                                ((ViewStub)
-                                                mParent.getRootView()
-                                                        .findViewById(
-                                                                R.id
-                                                                        .omnibox_results_container_stub))
-                                        .inflate();
-
                 mHolder = new SuggestionListViewHolder(container, dropdown);
                 for (int i = 0; i < mCallbacks.size(); i++) {
                     mCallbacks.get(i).onResult(mHolder);
diff --git a/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc b/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
index 1c9074b..5b873f9 100644
--- a/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
+++ b/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/lens/core/mojom/geometry.mojom.h"
 #include "chrome/browser/lens/core/mojom/lens.mojom.h"
 #include "chrome/browser/lens/core/mojom/overlay_object.mojom.h"
+#include "chrome/browser/lens/core/mojom/polygon.mojom.h"
 #include "chrome/browser/lens/core/mojom/text.mojom.h"
 #include "chrome/browser/lens/lens_overlay/lens_overlay_url_builder.h"
 #include "chrome/browser/profiles/profile.h"
@@ -75,7 +76,8 @@
     lens::mojom::Geometry::New(lens::mojom::CenterRotatedBox::New(
         gfx::RectF(0.1, 0.1, 0.8, 0.8),
         0.1,
-        lens::mojom::CenterRotatedBox_CoordinateType::kNormalized));
+        lens::mojom::CenterRotatedBox_CoordinateType::kNormalized),
+        std::vector<lens::mojom::PolygonPtr>());
 const lens::mojom::OverlayObjectPtr kTestOverlayObject =
     lens::mojom::OverlayObject::New("unique_id", kTestGeometry->Clone());
 const lens::mojom::TextPtr kTestText =
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc
index 16c2971..403f1a9 100644
--- a/chrome/browser/ui/toolbar/app_menu_model.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -1803,7 +1803,8 @@
           kShowSearchCompanion);
     }
 #endif
-    if (TabOrganizationUtils::GetInstance()->IsEnabled(browser_->profile())) {
+    if (base::FeatureList::IsEnabled(features::kTabOrganizationAppMenuItem) &&
+        TabOrganizationUtils::GetInstance()->IsEnabled(browser_->profile())) {
       auto* const tab_organization_service =
           TabOrganizationServiceFactory::GetForProfile(browser_->profile());
       if (tab_organization_service) {
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc
index 99ef46f..0cf10abf 100644
--- a/chrome/browser/ui/ui_features.cc
+++ b/chrome/browser/ui/ui_features.cc
@@ -330,10 +330,18 @@
              "MultiTabOrganization",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kTabOrganizationAppMenuItem,
+             "TabOrganizationAppMenuItem",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 BASE_FEATURE(kTabReorganization,
              "TabReorganization",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kTabReorganizationDivider,
+             "TabReorganizationDivider",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 const base::FeatureParam<base::TimeDelta> kTabOrganizationTriggerPeriod{
     &kTabOrganization, "trigger_period", base::Hours(6)};
 
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h
index c9bf462..1ebd3286 100644
--- a/chrome/browser/ui/ui_features.h
+++ b/chrome/browser/ui/ui_features.h
@@ -195,8 +195,12 @@
 
 BASE_DECLARE_FEATURE(kMultiTabOrganization);
 
+BASE_DECLARE_FEATURE(kTabOrganizationAppMenuItem);
+
 BASE_DECLARE_FEATURE(kTabReorganization);
 
+BASE_DECLARE_FEATURE(kTabReorganizationDivider);
+
 // The target (and minimum) interval between proactive nudge triggers. Measured
 // against a clock that only runs while Chrome is in the foreground.
 extern const base::FeatureParam<base::TimeDelta> kTabOrganizationTriggerPeriod;
diff --git a/chrome/browser/ui/views/permissions/chip/permission_chip_view.cc b/chrome/browser/ui/views/permissions/chip/permission_chip_view.cc
index c59e80d..54ebc62 100644
--- a/chrome/browser/ui/views/permissions/chip/permission_chip_view.cc
+++ b/chrome/browser/ui/views/permissions/chip/permission_chip_view.cc
@@ -14,7 +14,6 @@
 #include "chrome/browser/ui/views/location_bar/location_bar_util.h"
 #include "chrome/browser/ui/views/permissions/chip/multi_image_container.h"
 #include "chrome/browser/ui/views/permissions/permission_prompt_style.h"
-#include "components/content_settings/core/common/features.h"
 #include "components/permissions/permission_uma_util.h"
 #include "components/vector_icons/vector_icons.h"
 #include "third_party/skia/include/core/SkColor.h"
@@ -78,15 +77,9 @@
 
 void PermissionChipView::AnimateToFit(base::TimeDelta duration) {
   animation_->SetSlideDuration(duration);
-  if (base::FeatureList::IsEnabled(
-          content_settings::features::kLeftHandSideActivityIndicators)) {
-    base_width_ =
-        label()
-            ->GetPreferredSize(views::SizeBounds(label()->width(), {}))
-            .width();
-  } else {
-    base_width_ = label()->width();
-  }
+  base_width_ = label()
+                    ->GetPreferredSize(views::SizeBounds(label()->width(), {}))
+                    .width();
 
   if (label()
           ->GetPreferredSize(views::SizeBounds(label()->width(), {}))
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_ui.cc b/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
index 482103a..0604637 100644
--- a/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
+++ b/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
@@ -188,6 +188,9 @@
   source->AddBoolean(
       "multiTabOrganizationEnabled",
       base::FeatureList::IsEnabled(features::kMultiTabOrganization));
+  source->AddBoolean(
+      "tabReorganizationDividerEnabled",
+      base::FeatureList::IsEnabled(features::kTabReorganizationDivider));
 
   source->AddInteger("tabIndex", TabIndex());
   source->AddBoolean("showTabOrganizationFRE", ShowTabOrganizationFRE());
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index ee60ffc..68b057a 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1713549526-513cc19958801e69ab0dcb054cddaecf9dbac41f-04b7846c01008431ef7bc68790d96b840cfd0d5a.profdata
+chrome-android32-main-1713613758-3e0be7d68c07ec19972d447e2139338d89a1a083-be0b3aaa7aa7e8271feecde55d39e86891d91e6f.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 08b692a2..b6d44b5 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1713535023-224763ea8093ce273bd6bd8bea42cbd1243d501c-05c14d459b50bff3409929b9407a333ba9f06c54.profdata
+chrome-android64-main-1713620838-aa9072fd20b35eb85097c2abbab0d08ebff2e04b-90b9cb64cb6cd054796a4ac3398af86532c7518f.profdata
diff --git a/chrome/build/lacros-arm64.pgo.txt b/chrome/build/lacros-arm64.pgo.txt
index 241df633..56409b9 100644
--- a/chrome/build/lacros-arm64.pgo.txt
+++ b/chrome/build/lacros-arm64.pgo.txt
@@ -1 +1 @@
-chrome-chromeos-arm64-generic-main-1713484561-f09c60c5c26ed684f3fbcf7b7da048fe5bd3552d-9f1721f07da35be11e0164b09553d85361b8bb28.profdata
+chrome-chromeos-arm64-generic-main-1713571112-15f2a29c1df7c1e547632bee7439b2ad3f639d1c-f5dc0130097d4f7180bd89f9e98ea0c2d191d52d.profdata
diff --git a/chrome/build/lacros64.pgo.txt b/chrome/build/lacros64.pgo.txt
index cd9c90c..d0c2a2ed 100644
--- a/chrome/build/lacros64.pgo.txt
+++ b/chrome/build/lacros64.pgo.txt
@@ -1 +1 @@
-chrome-chromeos-amd64-generic-main-1713528079-948cb9053036c6543cc6cd0e9fb39de64a1397f8-c14dac4d1a278da63957a21906a1a8afc207d7c8.profdata
+chrome-chromeos-amd64-generic-main-1713613758-960eef9911e3dd557da7987619cc19b461117ea7-be0b3aaa7aa7e8271feecde55d39e86891d91e6f.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index eddb5d3a..f8ba8e9 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1713549526-11d9875dc587c213a4f3765476c7565725cb294a-04b7846c01008431ef7bc68790d96b840cfd0d5a.profdata
+chrome-linux-main-1713613758-7d3713f52b3a09bc5d861b3394f436263d855b6a-be0b3aaa7aa7e8271feecde55d39e86891d91e6f.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index d07fc52f6..0822d39 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1713311815-8c91a8341ca73c4c2f761dce3c6e17b1dcff0900-38a628064b77ab180a922d8340eac1b0353950af.profdata
+chrome-mac-arm-main-1713626731-aed4f17d6ddb501b95104e570fe52a2d0fac861f-fd182aa9be5bb3d637ccddff2bd55642a20c85ec.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 92f7f7f3..b7afac8 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1713549526-c3c783cd1f21477bee5d09a8a93d471ebe37c4a6-04b7846c01008431ef7bc68790d96b840cfd0d5a.profdata
+chrome-win-arm64-main-1713613758-523f8a947251af54f7dd34f742a3c7619ab0f524-be0b3aaa7aa7e8271feecde55d39e86891d91e6f.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 91f3d3a..7aecee6 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1713549526-0b3e60d982e5693da8cdb4ac2752f230591e8eb5-04b7846c01008431ef7bc68790d96b840cfd0d5a.profdata
+chrome-win32-main-1713613758-b64b76e80278e48e0844766800c151fb9fc4b9ab-be0b3aaa7aa7e8271feecde55d39e86891d91e6f.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 8571669..a6aaa7c 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1713549526-1b144e1c12e7066c6843d2fc2cd049315504d327-04b7846c01008431ef7bc68790d96b840cfd0d5a.profdata
+chrome-win64-main-1713613758-5744bbfd546a92eb91f6e1265da96c3decca7bb7-be0b3aaa7aa7e8271feecde55d39e86891d91e6f.profdata
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_anchor_win.png b/chrome/test/data/focus_rings/focus_ring_browsertest_anchor_win.png
index 6b146c1..b50c35e 100644
--- a/chrome/test/data/focus_rings/focus_ring_browsertest_anchor_win.png
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_anchor_win.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_button_win.png b/chrome/test/data/focus_rings/focus_ring_browsertest_button_win.png
index 3fced26..0680afc6 100644
--- a/chrome/test/data/focus_rings/focus_ring_browsertest_button_win.png
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_button_win.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox_win.png b/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox_win.png
index e13284c..5eb51cb 100644
--- a/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox_win.png
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox_win.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_win.png b/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_win.png
index 89d7308..a621f12e 100644
--- a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_win.png
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_win.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_radio_win.png b/chrome/test/data/focus_rings/focus_ring_browsertest_radio_win.png
index 62241ce..0bce232 100644
--- a/chrome/test/data/focus_rings/focus_ring_browsertest_radio_win.png
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_radio_win.png
Binary files differ
diff --git a/chrome/test/data/webui/chromeos/settings/os_settings_browsertest.cc b/chrome/test/data/webui/chromeos/settings/os_settings_browsertest.cc
index 66b8db3..daf01eb 100644
--- a/chrome/test/data/webui/chromeos/settings/os_settings_browsertest.cc
+++ b/chrome/test/data/webui/chromeos/settings/os_settings_browsertest.cc
@@ -523,6 +523,29 @@
     testing::Bool(),
     OSSettingsRevampOsA11yTestPdfOcrEnabled::DescribeParams);
 
+class OSSettingsRevampFilesTestCrosComponentsAndJellyEnabled
+    : public OSSettingsRevampMochaTest {
+ protected:
+  OSSettingsRevampFilesTestCrosComponentsAndJellyEnabled() {
+    scoped_feature_list_.InitWithFeatures(
+        /*enabled=*/
+        {
+            chromeos::features::kCrosComponents,
+            chromeos::features::kJelly,
+        },
+        /*disabled=*/{});
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    RevampParameterized,
+    OSSettingsRevampFilesTestCrosComponentsAndJellyEnabled,
+    testing::Bool(),
+    OSSettingsRevampFilesTestCrosComponentsAndJellyEnabled::DescribeParams);
+
 /* End Test Classes */
 
 IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, AppLanguageSelectionDialog) {
@@ -1408,7 +1431,7 @@
   RunSettingsTest("os_bluetooth_page/os_paired_bluetooth_list_item_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsFilesPage) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsFilesPage) {
   RunSettingsTest("os_files_page/os_files_page_test.js");
 }
 
@@ -1417,54 +1440,38 @@
   RunSettingsTest("os_files_page/files_settings_card_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsFilesPageGoogleDrivePage) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsFilesPageGoogleDrivePage) {
   RunSettingsTest("os_files_page/google_drive_page_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsFilesPageOneDrivePage) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsFilesPageOneDrivePage) {
   RunSettingsTest("os_files_page/one_drive_page_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsFilesPageOfficePage) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsFilesPageOfficePage) {
   RunSettingsTest("os_files_page/office_page_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsFilesPageSmbSharesPage) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsFilesPageSmbSharesPage) {
   RunSettingsTest("os_files_page/smb_shares_page_test.js");
 }
 
-class OSSettingsFilesTestCrosComponentsAndJellyEnabled
-    : public OSSettingsMochaTest {
- protected:
-  OSSettingsFilesTestCrosComponentsAndJellyEnabled() {
-    scoped_feature_list_.InitWithFeatures(
-        /*enabled=*/
-        {
-            chromeos::features::kCrosComponents,
-            chromeos::features::kJelly,
-        },
-        /*disabled=*/{});
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-IN_PROC_BROWSER_TEST_F(OSSettingsFilesTestCrosComponentsAndJellyEnabled,
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampFilesTestCrosComponentsAndJellyEnabled,
                        OsFilesPageSmbSharesPageJelly) {
   RunSettingsTest("os_files_page/smb_shares_page_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsLanguagesPageAppLanguagesPage) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
+                       OsLanguagesPageAppLanguagesPage) {
   RunSettingsTest("os_languages_page/app_languages_page_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest,
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
                        OsLanguagesPageInputMethodOptionsPage) {
   RunSettingsTest("os_languages_page/input_method_options_page_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsLanguagesPageInputPage) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsLanguagesPageInputPage) {
   RunSettingsTest("os_languages_page/input_page_test.js");
 }
 
@@ -1473,57 +1480,49 @@
   RunSettingsTest("os_languages_page/language_settings_card_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest,
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
                        OsLanguagesPageOsClearPersonalizationDataPage) {
   RunSettingsTest(
       "os_languages_page/os_clear_personalization_data_page_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsLanguagesPageV2) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsLanguagesPageV2) {
   RunSettingsTest("os_languages_page/os_languages_page_v2_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest,
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
                        OsLanguagesPageOsEditDictionaryPage) {
   RunSettingsTest("os_languages_page/os_edit_dictionary_page_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTestRevampDisabled, OsPageAvailability) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsPageAvailability) {
   RunSettingsTest("os_page_availability_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTestRevampEnabled,
-                       OsPageAvailabilityRevamp) {
-  RunSettingsTest("os_page_availability_test.js");
-}
-
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTestRevampDisabled, OsPeoplePage) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsPeoplePage) {
   RunSettingsTest("os_people_page/os_people_page_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTestRevampEnabled, OsPeoplePageRevamp) {
-  RunSettingsTest("os_people_page/os_people_page_test.js");
-}
-
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsPeoplePageAddUserDialog) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsPeoplePageAddUserDialog) {
   RunSettingsTest("os_people_page/add_user_dialog_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest,
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
                        OsPeoplePageFingerprintListSubpage) {
   RunSettingsTest("os_people_page/fingerprint_list_subpage_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsPeoplePageOsSyncControlsSubpage) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
+                       OsPeoplePageOsSyncControlsSubpage) {
   RunSettingsTest("os_people_page/os_sync_controls_subpage_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest,
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
                        OsPeoplePagePersonalizationOptions) {
   RunSettingsTest("os_people_page/personalization_options_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsPrintingPage) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsPrintingPage) {
   RunSettingsTest("os_printing_page/os_printing_page_test.js");
 }
 
@@ -1532,28 +1531,32 @@
   RunSettingsTest("os_printing_page/printing_settings_card_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsPrintingPageCupsPrintServer) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
+                       OsPrintingPageCupsPrintServer) {
   RunSettingsTest("os_printing_page/cups_print_server_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsPrintingPageCupsPrinterDialog) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
+                       OsPrintingPageCupsPrinterDialog) {
   RunSettingsTest("os_printing_page/cups_printer_dialog_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest,
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
                        OsPrintingPageCupsPrinterLandingPage) {
   RunSettingsTest("os_printing_page/cups_printer_landing_page_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsPrintingPageCupsPrintersEntry) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
+                       OsPrintingPageCupsPrintersEntry) {
   RunSettingsTest("os_printing_page/cups_printers_entry_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsPrintingPageCupsPrinterPage) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest,
+                       OsPrintingPageCupsPrinterPage) {
   RunSettingsTest("os_printing_page/cups_printer_page_test.js");
 }
 
-IN_PROC_BROWSER_TEST_F(OSSettingsMochaTest, OsPrintingPagePrinterStatus) {
+IN_PROC_BROWSER_TEST_P(OSSettingsRevampMochaTest, OsPrintingPagePrinterStatus) {
   RunSettingsTest("os_printing_page/printer_status_test.js");
 }
 
diff --git a/chrome/test/data/webui/cr_elements/cr_selectable_mixin_test.ts b/chrome/test/data/webui/cr_elements/cr_selectable_mixin_test.ts
index 35a52d6e..04bde90 100644
--- a/chrome/test/data/webui/cr_elements/cr_selectable_mixin_test.ts
+++ b/chrome/test/data/webui/cr_elements/cr_selectable_mixin_test.ts
@@ -6,7 +6,7 @@
 import {CrSelectableMixin} from 'chrome://resources/cr_elements/cr_menu_selector/cr_selectable_mixin.js';
 import {html, CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js';
 import {getTrustedHtml} from 'chrome://webui-test/trusted_html.js';
-import {assertEquals} from 'chrome://webui-test/chai_assert.js';
+import {assertEquals, assertTrue, assertNull} from 'chrome://webui-test/chai_assert.js';
 import {eventToPromise} from 'chrome://webui-test/test_util.js';
 // clang-format on
 
@@ -118,3 +118,93 @@
     assertSelected(0);
   });
 });
+
+suite('cr-scrollable-mixin overrides', function() {
+  const TestOverridesElementBase = CrSelectableMixin(CrLitElement);
+
+  class TestOverridesElement extends TestOverridesElementBase {
+    static get is() {
+      return 'test-overrides-element';
+    }
+
+    override render() {
+      return html`
+        <a href="/a">a</a>
+        <a href="/b">b</a>
+        <a href="/c">c</a>
+        <a href="/d">d</a>
+        <div>e</div>
+      `;
+    }
+
+    constructor() {
+      super();
+
+      /** Property for CrSelectableMixin */
+      this.attrForSelected = 'href';
+    }
+
+    // Override `observeItems` from CrSelectableMixin.
+    override observeItems() {
+      // Turn off default observation logic in CrSelectableMixin.
+    }
+
+    // Override `queryItems` from CrSelectableMixin.
+    override queryItems() {
+      return Array.from(this.shadowRoot!.querySelectorAll('a'));
+    }
+
+    override connectedCallback() {
+      super.connectedCallback();
+      this.itemsChanged();
+    }
+  }
+
+  customElements.define(TestOverridesElement.is, TestOverridesElement);
+
+  let element: TestOverridesElement;
+
+  setup(function() {
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    element = document.createElement('test-overrides-element') as
+        TestOverridesElement;
+    document.body.appendChild(element);
+  });
+
+  test('All', async () => {
+    // Assert that selectable items have been detected.
+    assertEquals(4, element.getItemsForTest().length);
+    assertNull(element.selectedItem);
+
+    // Select the 2nd item.
+    element.selected = 'chrome://webui-test/b';
+    await element.updateComplete;
+    let selectedItem = element.shadowRoot!.querySelector('.iron-selected');
+    assertTrue(!!selectedItem);
+    assertEquals(selectedItem, element.selectedItem);
+    assertEquals('b', selectedItem.textContent);
+
+    // Remove the selected item, and manually call itemsChanged().
+    selectedItem.remove();
+    element.itemsChanged();
+    assertEquals(3, element.getItemsForTest().length);
+    assertNull(element.selectedItem);
+
+    // Select the 1st item.
+    element.selected = 'chrome://webui-test/a';
+    await element.updateComplete;
+    selectedItem = element.shadowRoot!.querySelector('.iron-selected');
+    assertTrue(!!selectedItem);
+    assertEquals(selectedItem, element.selectedItem);
+    assertEquals('a', selectedItem.textContent);
+
+    // Select the next item.
+    element.selectNext();
+    await element.updateComplete;
+    assertEquals('chrome://webui-test/c', element.selected);
+    selectedItem = element.shadowRoot!.querySelector('.iron-selected');
+    assertTrue(!!selectedItem);
+    assertEquals(selectedItem, element.selectedItem);
+    assertEquals('c', selectedItem.textContent);
+  });
+});
diff --git a/chrome/test/data/webui/lens/overlay/selection_overlay_test.ts b/chrome/test/data/webui/lens/overlay/selection_overlay_test.ts
index c6ddc56..a524de1 100644
--- a/chrome/test/data/webui/lens/overlay/selection_overlay_test.ts
+++ b/chrome/test/data/webui/lens/overlay/selection_overlay_test.ts
@@ -169,7 +169,38 @@
                 .regionSelectionCanvas.height);
       });
 
-  test(
+    test(
+      'verify object selection canvas resizes when selection overlay resizes',
+      async () => {
+        selectionOverlayElement.style.display = 'block';
+        selectionOverlayElement.style.width = '50px';
+        selectionOverlayElement.style.height = '50px';
+        // Resize observer does not trigger with flushTasks(), so we need to use
+        // waitAfterNextRender() instead.
+        await waitAfterNextRender(selectionOverlayElement);
+        assertEquals(
+            50,
+            selectionOverlayElement.$.objectSelectionLayer.$
+                .objectSelectionCanvas.width);
+        assertEquals(
+            50,
+            selectionOverlayElement.$.objectSelectionLayer.$
+                .objectSelectionCanvas.height);
+
+        selectionOverlayElement.style.width = '200px';
+        selectionOverlayElement.style.height = '200px';
+        await waitAfterNextRender(selectionOverlayElement);
+        assertEquals(
+            200,
+            selectionOverlayElement.$.objectSelectionLayer.$
+                .objectSelectionCanvas.width);
+        assertEquals(
+            200,
+            selectionOverlayElement.$.objectSelectionLayer.$
+                .objectSelectionCanvas.height);
+      });
+
+    test(
       `verify that only objects respond to taps, even when text overlaps`,
       async () => {
         await Promise.all([addWords(), addObjects()]);
diff --git a/chrome/test/data/webui/lens/utils/object_utils.ts b/chrome/test/data/webui/lens/utils/object_utils.ts
index b9444ef..95e363e 100644
--- a/chrome/test/data/webui/lens/utils/object_utils.ts
+++ b/chrome/test/data/webui/lens/utils/object_utils.ts
@@ -34,6 +34,7 @@
         rotation: 0,
         coordinateType: CenterRotatedBox_CoordinateType.kNormalized,
       },
+      segmentationPolygon: [],
     },
   };
 }
diff --git a/chrome/test/data/webui/lens/utils/text_utils.ts b/chrome/test/data/webui/lens/utils/text_utils.ts
index eb16048..6394ad2 100644
--- a/chrome/test/data/webui/lens/utils/text_utils.ts
+++ b/chrome/test/data/webui/lens/utils/text_utils.ts
@@ -34,6 +34,7 @@
         rotation: 0,
         coordinateType: CenterRotatedBox_CoordinateType.kNormalized,
       },
+      segmentationPolygon: [],
     },
     formulaMetadata: null,
   };
diff --git a/chromeos/profiles/arm-exp.afdo.newest.txt b/chromeos/profiles/arm-exp.afdo.newest.txt
index 93e356d9..d25adcdc 100644
--- a/chromeos/profiles/arm-exp.afdo.newest.txt
+++ b/chromeos/profiles/arm-exp.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-exp-125-6367.24-1712572414-benchmark-125.0.6407.0-r2-redacted.afdo.xz
+chromeos-chrome-arm-exp-125-6411.0-1713176715-benchmark-126.0.6427.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/arm.afdo.newest.txt b/chromeos/profiles/arm.afdo.newest.txt
index 66930e0..650d0fc 100644
--- a/chromeos/profiles/arm.afdo.newest.txt
+++ b/chromeos/profiles/arm.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-none-125-6367.24-1713181437-benchmark-126.0.6423.0-r1-redacted.afdo.xz
+chromeos-chrome-arm-none-125-6367.24-1713181437-benchmark-126.0.6427.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index 484d384..6de915e1 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-125-6411.0-1713176715-benchmark-126.0.6423.0-r2-redacted.afdo.xz
+chromeos-chrome-amd64-atom-125-6411.0-1713176715-benchmark-126.0.6427.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index 76d7dbf2..a5109bd94 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-125-6398.0-1713174332-benchmark-126.0.6423.0-r2-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-125-6398.0-1713174332-benchmark-126.0.6427.0-r1-redacted.afdo.xz
diff --git a/clank b/clank
index 22b403f..6d9a82db 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 22b403ffb0f1621c38960ae1cedd464b8efc700c
+Subproject commit 6d9a82dba7830e586b0c1e8c01847add8dd68240
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index 1b7a3f9..2c0503c 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "33.49",
-  "log_list_timestamp": "2024-04-19T12:55:44Z",
+  "version": "33.50",
+  "log_list_timestamp": "2024-04-20T12:55:11Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/commerce/core/compare/cluster_manager.cc b/components/commerce/core/compare/cluster_manager.cc
index fc2e65b..96fcb67 100644
--- a/components/commerce/core/compare/cluster_manager.cc
+++ b/components/commerce/core/compare/cluster_manager.cc
@@ -7,7 +7,9 @@
 #include <optional>
 #include <set>
 #include <string>
+#include <vector>
 
+#include "base/barrier_callback.h"
 #include "components/commerce/core/compare/candidate_product.h"
 #include "components/commerce/core/compare/product_group.h"
 #include "components/commerce/core/product_specifications/product_specifications_service.h"
@@ -79,6 +81,23 @@
   }
   return false;
 }
+
+void OnGetCategoryDataDone(
+    base::OnceCallback<void(const CategoryData&)> callback,
+    const GURL& url,
+    const std::optional<const ProductInfo>& product_info) {
+  std::move(callback).Run(product_info ? product_info->category_data
+                                       : CategoryData());
+}
+
+void GetCategoryData(
+    const GURL& url,
+    const ClusterManager::GetProductInfoCallback& get_product_info_cb,
+    base::OnceCallback<void(const CategoryData&)> callback) {
+  get_product_info_cb.Run(
+      url, base::BindOnce(&OnGetCategoryDataDone, std::move(callback)));
+}
+
 }  // namespace
 
 ClusterManager::ClusterManager(
@@ -94,11 +113,22 @@
 
 void ClusterManager::OnProductSpecificationsSetAdded(
     const ProductSpecificationsSet& product_specifications_set) {
-  // TODO(qinmin): need to get the category data for the products in
-  // `product_specifications_set`.
-  auto product_group = std::make_unique<ProductGroup>(
-      product_specifications_set.uuid(), product_specifications_set.urls());
-  UpdateProductGroup(std::move(product_group));
+  base::Uuid uuid = product_specifications_set.uuid();
+  product_group_map_[uuid] =
+      std::make_unique<ProductGroup>(uuid, product_specifications_set.urls());
+  const std::set<GURL>& urls = product_group_map_[uuid]->member_products;
+  if (urls.size() == 0) {
+    CHECK(false) << "Production specification set shouldn't be empty.";
+    return;
+  }
+
+  auto barrier_callback = base::BarrierCallback<const CategoryData&>(
+      urls.size(), base::BindOnce(&ClusterManager::OnAllCategoryDataRetrieved,
+                                  weak_ptr_factory_.GetWeakPtr(),
+                                  product_specifications_set.uuid(), urls));
+  for (const auto& url : urls) {
+    GetCategoryData(url, get_product_info_cb_, barrier_callback);
+  }
 }
 
 void ClusterManager::OnProductSpecificationsSetUpdate(
@@ -107,7 +137,7 @@
 }
 
 void ClusterManager::OnProductSpecificationsSetRemoved(const base::Uuid& uuid) {
-  RemoveProductGroup(uuid);
+  product_group_map_.erase(uuid);
 }
 
 void ClusterManager::WebWrapperDestroyed(const GURL& url) {
@@ -143,10 +173,21 @@
     return;
   }
 
-  // TODO(qinmin): If a product is added to a product group, determine
-  // whether it should be removed from `candidate_product_map_`.
   AddCandidateProduct(url, product_info);
-  AddProductToProductGroupssIfNecessary(url, product_info);
+}
+
+void ClusterManager::OnAllCategoryDataRetrieved(
+    const base::Uuid& uuid,
+    const std::set<GURL>& urls,
+    const std::vector<CategoryData>& category_data) {
+  if (!product_group_map_[uuid]) {
+    return;
+  }
+
+  // Check whether product group has changed.
+  if (product_group_map_[uuid]->member_products == urls) {
+    product_group_map_[uuid]->categories = category_data;
+  }
 }
 
 void ClusterManager::AddCandidateProduct(
@@ -166,25 +207,6 @@
       similar_products;
 }
 
-void ClusterManager::AddProductToProductGroupssIfNecessary(
-    const GURL& url,
-    const std::optional<const ProductInfo>& product_info) {
-  for (const auto& group : product_group_map_) {
-    if (group.second->member_products.find(url) !=
-        group.second->member_products.end()) {
-      continue;
-    }
-    if (group.second->candidate_products.find(url) !=
-        group.second->candidate_products.end()) {
-      DCHECK(false);
-      continue;
-    }
-    if (IsProductSimilarToGroup(product_info->category_data,
-                                group.second->categories)) {
-      group.second->candidate_products.insert(url);
-    }
-  }
-}
 
 void ClusterManager::RemoveCandidateProductURLIfNotOpen(const GURL& url) {
   if (candidate_product_map_.find(url) != candidate_product_map_.end() &&
@@ -193,34 +215,24 @@
     for (const auto& product : candidate_product_map_) {
       product.second->similar_candidate_products_urls.erase(url);
     }
-    RemoveProductFromProductGroupsIfNecessary(url);
   }
 }
 
-void ClusterManager::RemoveProductFromProductGroupsIfNecessary(
-    const GURL& url) {
-  for (const auto& group : product_group_map_) {
-    if (group.second->candidate_products.find(url) !=
-        group.second->candidate_products.end()) {
-      group.second->candidate_products.erase(url);
-    }
-  }
-}
-
-void ClusterManager::UpdateProductGroup(
-    std::unique_ptr<ProductGroup> product_group) {
-  ProductGroup* group = product_group.get();
-  product_group_map_[product_group->uuid] = std::move(product_group);
+std::vector<GURL> ClusterManager::FindSimilarCandidateProductsForProductGroup(
+    const base::Uuid& uuid) {
+  std::vector<GURL> candidate_products;
+  ProductGroup* group = product_group_map_[uuid].get();
   for (const auto& candidate_product : candidate_product_map_) {
+    if (group->member_products.find(candidate_product.first) !=
+        group->member_products.end()) {
+      continue;
+    }
     if (IsProductSimilarToGroup(candidate_product.second->category_data,
                                 group->categories)) {
-      group->candidate_products.insert(candidate_product.first);
+      candidate_products.emplace_back(candidate_product.first);
     }
   }
-}
-
-void ClusterManager::RemoveProductGroup(const base::Uuid& uuid) {
-  product_group_map_.erase(uuid);
+  return candidate_products;
 }
 
 }  // namespace commerce
diff --git a/components/commerce/core/compare/cluster_manager.h b/components/commerce/core/compare/cluster_manager.h
index 48c08d03..a9b1d2dc7 100644
--- a/components/commerce/core/compare/cluster_manager.h
+++ b/components/commerce/core/compare/cluster_manager.h
@@ -7,6 +7,7 @@
 
 #include <map>
 #include <memory>
+#include <vector>
 
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
@@ -54,33 +55,29 @@
  private:
   friend class ClusterManagerTest;
 
-  // Adds or updates a product group to the `product_group_map_`.
-  void UpdateProductGroup(std::unique_ptr<ProductGroup> product_group);
-
-  // Removes a product group from `product_group_map_`.
-  void RemoveProductGroup(const base::Uuid& uuid);
+  // Find similar candidate products for a product group.
+  std::vector<GURL> FindSimilarCandidateProductsForProductGroup(
+      const base::Uuid& uuid);
 
   // Called when information about a product is retrieved.
   void OnProductInfoRetrieved(
       const GURL& url,
       const std::optional<const ProductInfo>& product_info);
 
+  // Called when category data for a list of URLs are retrieved.
+  void OnAllCategoryDataRetrieved(
+      const base::Uuid& uuid,
+      const std::set<GURL>& urls,
+      const std::vector<CategoryData>& category_data);
+
   // Adds a candidate product to `candidate_product_map_`.
   void AddCandidateProduct(
       const GURL& url,
       const std::optional<const ProductInfo>& product_info);
 
-  // Adds a new product to `product_group_map_` if necessary.
-  void AddProductToProductGroupssIfNecessary(
-      const GURL& url,
-      const std::optional<const ProductInfo>& product_info);
-
   // Removes a candidate product URL if it is not open in any tabs.
   void RemoveCandidateProductURLIfNotOpen(const GURL& url);
 
-  // Removes a product to `product_group_map_` if necessary.
-  void RemoveProductFromProductGroupsIfNecessary(const GURL& url);
-
   // Callback to get product info.
   GetProductInfoCallback get_product_info_cb_;
 
diff --git a/components/commerce/core/compare/cluster_manager_unittest.cc b/components/commerce/core/compare/cluster_manager_unittest.cc
index 165cfd4..cf296d83 100644
--- a/components/commerce/core/compare/cluster_manager_unittest.cc
+++ b/components/commerce/core/compare/cluster_manager_unittest.cc
@@ -4,15 +4,19 @@
 
 #include "components/commerce/core/compare/cluster_manager.h"
 
+#include <algorithm>
+#include <map>
 #include <string>
 #include <vector>
 
 #include "base/functional/callback.h"
+#include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "components/commerce/core/commerce_types.h"
 #include "components/commerce/core/compare/candidate_product.h"
 #include "components/commerce/core/compare/product_group.h"
 #include "components/commerce/core/product_specifications/product_specifications_service.h"
+#include "components/commerce/core/product_specifications/product_specifications_set.h"
 #include "components/commerce/core/proto/product_category.pb.h"
 #include "components/sync/test/mock_model_type_change_processor.h"
 #include "components/sync/test/model_type_store_test_util.h"
@@ -25,9 +29,11 @@
 const std::string kTestUrl1 = "http://www.foo1.com";
 const std::string kTestUrl2 = "http://www.foo2.com";
 const std::string kTestUrl3 = "http://www.foo3.com";
+const std::string kProductUrl = "http://www.chair.com";
 const std::string kCategoryLamp = "Lamp";
 const std::string kCategoryChair = "Chair";
 const std::string kCategoryGamingChair = "GamingChair";
+const std::string kProductGroupName = "Furniture";
 }  // namespace
 
 class ClusterManagerTest : public testing::Test {
@@ -49,10 +55,13 @@
                             base::Unretained(this)),
         base::BindRepeating(&ClusterManagerTest::url_infos,
                             base::Unretained(this)));
+    InitializeProductInfos();
   }
 
   void GetProductInfo(const GURL& url, ProductInfoCallback product_info_cb) {
-    std::move(product_info_cb).Run(url, product_info_);
+    task_environment_.GetMainThreadTaskRunner()->PostTask(
+        FROM_HERE,
+        base::BindOnce(std::move(product_info_cb), url, product_infos_[url]));
   }
 
   const std::vector<UrlInfo> url_infos() { return url_infos_; }
@@ -74,41 +83,45 @@
     }
   }
 
-  void UpdateProductInfo(const std::string& label) {
-    product_info_ = ProductInfo();
-    AddProductCategoryToProductInfo(label);
-  }
-
-  void AddProductCategoryToProductInfo(const std::string& label) {
-    product_info_.category_data.add_product_categories()
-        ->add_category_labels()
-        ->set_category_default_label(label);
-  }
-
-  base::Uuid AddProductGroup(const std::string& label) {
+  base::Uuid AddProductSpecificationSet() {
     base::Uuid uuid = base::Uuid::GenerateRandomV4();
-    std::unique_ptr<ProductGroup> group =
-        std::make_unique<ProductGroup>(uuid, std::vector<GURL>());
-    CategoryData data;
-    data.add_product_categories()
-        ->add_category_labels()
-        ->set_category_default_label(label);
-    group->categories.emplace_back(data);
-    cluster_manager_->UpdateProductGroup(std::move(group));
+    std::vector<GURL> url_group = {GURL(kProductUrl)};
+    cluster_manager_->OnProductSpecificationsSetAdded(ProductSpecificationsSet(
+        uuid.AsLowercaseString(), 0, 0, url_group, kProductGroupName));
     return uuid;
   }
 
-  void RemoveProductGroup(const base::Uuid& uuid) {
-    cluster_manager_->RemoveProductGroup(uuid);
+  void RemoveProductSpecificationSet(const base::Uuid& uuid) {
+    cluster_manager_->OnProductSpecificationsSetRemoved(uuid);
+  }
+
+  std::vector<GURL> FindSimilarCandidateProductsForProductGroup(
+      const base::Uuid& uuid) {
+    return cluster_manager_->FindSimilarCandidateProductsForProductGroup(uuid);
   }
 
  protected:
+  ProductInfo CreateProductInfo(const std::string& label) {
+    ProductInfo product_info = ProductInfo();
+    product_info.category_data.add_product_categories()
+        ->add_category_labels()
+        ->set_category_default_label(label);
+    return product_info;
+  }
+
+  void InitializeProductInfos() {
+    product_infos_[GURL(kTestUrl1)] = CreateProductInfo(kCategoryLamp);
+    product_infos_[GURL(kTestUrl2)] = CreateProductInfo(kCategoryChair);
+    product_infos_[GURL(kTestUrl3)] = CreateProductInfo(kCategoryLamp);
+    product_infos_[GURL(kProductUrl)] = CreateProductInfo(kCategoryLamp);
+  }
+
   base::test::TaskEnvironment task_environment_;
   std::unique_ptr<syncer::ModelTypeStore> store_;
   std::unique_ptr<ProductSpecificationsService> product_specification_service_;
   testing::NiceMock<syncer::MockModelTypeChangeProcessor> processor_;
   std::unique_ptr<ClusterManager> cluster_manager_;
-  ProductInfo product_info_;
+  std::map<GURL, ProductInfo> product_infos_;
   std::vector<UrlInfo> url_infos_;
 };
 
@@ -118,6 +131,7 @@
   info.url = url;
   url_infos_.emplace_back(info);
   cluster_manager_->DidNavigatePrimaryMainFrame(url);
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, GetCandidateProductMap()->size());
 
   url_infos_.clear();
@@ -132,13 +146,10 @@
   UpdateUrlInfos(std::vector<GURL>{foo1, foo2, foo3});
 
   // Add 3 products, product 1 and 3 has the same category.
-  UpdateProductInfo(kCategoryLamp);
-
   cluster_manager_->DidNavigatePrimaryMainFrame(foo1);
-  UpdateProductInfo(kCategoryChair);
   cluster_manager_->DidNavigatePrimaryMainFrame(foo2);
-  UpdateProductInfo(kCategoryLamp);
   cluster_manager_->DidNavigatePrimaryMainFrame(foo3);
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(3u, GetCandidateProductMap()->size());
 
   CandidateProduct* product1 = (*GetCandidateProductMap())[foo1].get();
@@ -160,17 +171,17 @@
   UpdateUrlInfos(std::vector<GURL>{foo1, foo2, foo3});
 
   // Product 1 belongs to 2 categories.
-  UpdateProductInfo(kCategoryLamp);
-  AddProductCategoryToProductInfo(kCategoryChair);
+  product_infos_[foo1].category_data.add_product_categories()
+        ->add_category_labels()
+        ->set_category_default_label(kCategoryChair);
   cluster_manager_->DidNavigatePrimaryMainFrame(foo1);
   // Product 2's category label has 2 levels, Chair -> GamingChair.
-  UpdateProductInfo(kCategoryChair);
-  product_info_.category_data.mutable_product_categories(0)
-      ->add_category_labels()
-      ->set_category_default_label(kCategoryGamingChair);
+  product_infos_[foo2].category_data.mutable_product_categories(0)
+        ->add_category_labels()
+        ->set_category_default_label(kCategoryGamingChair);
   cluster_manager_->DidNavigatePrimaryMainFrame(foo2);
-  UpdateProductInfo(kCategoryLamp);
   cluster_manager_->DidNavigatePrimaryMainFrame(foo3);
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(3u, GetCandidateProductMap()->size());
 
   CandidateProduct* product1 = (*GetCandidateProductMap())[foo1].get();
@@ -194,12 +205,10 @@
   UpdateUrlInfos(std::vector<GURL>{foo1, foo2, foo3});
 
   // Add 3 products, product 1 and 3 has the same category.
-  UpdateProductInfo(kCategoryLamp);
   cluster_manager_->DidNavigatePrimaryMainFrame(foo1);
-  UpdateProductInfo(kCategoryChair);
   cluster_manager_->DidNavigatePrimaryMainFrame(foo2);
-  UpdateProductInfo(kCategoryLamp);
   cluster_manager_->DidNavigatePrimaryMainFrame(foo3);
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(3u, GetCandidateProductMap()->size());
 
   // Remove product 3.
@@ -214,105 +223,141 @@
   ASSERT_EQ(product2->similar_candidate_products_urls.size(), 0u);
 }
 
-TEST_F(ClusterManagerTest, AddCandidateProductToExistingProductGroup) {
-  base::Uuid uuid = AddProductGroup(kCategoryLamp);
-  ProductGroup* product_group = (*GetProductGroupMap())[uuid].get();
-
+TEST_F(ClusterManagerTest,
+       CandidateProductRemovedBeforeGetProductInfoCompletes) {
   GURL foo1(kTestUrl1);
   GURL foo2(kTestUrl2);
   GURL foo3(kTestUrl3);
   UpdateUrlInfos(std::vector<GURL>{foo1, foo2, foo3});
 
-  // Add the first product.
-  UpdateProductInfo(kCategoryLamp);
+  // Add 2 products.
   cluster_manager_->DidNavigatePrimaryMainFrame(foo1);
-  ASSERT_EQ(0u, product_group->member_products.size());
-  ASSERT_EQ(1u, product_group->candidate_products.size());
-  ASSERT_EQ(product_group->candidate_products.count(foo1), 1u);
-
-  // Add the second product.
-  UpdateProductInfo(kCategoryChair);
   cluster_manager_->DidNavigatePrimaryMainFrame(foo2);
-  ASSERT_EQ(0u, product_group->member_products.size());
-  ASSERT_EQ(1u, product_group->candidate_products.size());
-  ASSERT_EQ(product_group->candidate_products.count(foo1), 1u);
+  base::RunLoop().RunUntilIdle();
 
-  // Add the third product.
-  UpdateProductInfo(kCategoryLamp);
+  // Add the 3rd product, and immediately removes it.
   cluster_manager_->DidNavigatePrimaryMainFrame(foo3);
-  ASSERT_EQ(0u, product_group->member_products.size());
-  ASSERT_EQ(2u, product_group->candidate_products.size());
-  ASSERT_EQ(product_group->candidate_products.count(foo1), 1u);
-  ASSERT_EQ(product_group->candidate_products.count(foo3), 1u);
-}
-
-TEST_F(ClusterManagerTest, AddProductGroupAfterAddingCandidateProduct) {
-  GURL foo1(kTestUrl1);
-  GURL foo2(kTestUrl2);
-  GURL foo3(kTestUrl3);
-  UpdateUrlInfos(std::vector<GURL>{foo1, foo2, foo3});
-
-  UpdateProductInfo(kCategoryLamp);
-  cluster_manager_->DidNavigatePrimaryMainFrame(foo1);
-  UpdateProductInfo(kCategoryChair);
-  cluster_manager_->DidNavigatePrimaryMainFrame(foo2);
-  UpdateProductInfo(kCategoryLamp);
-  cluster_manager_->DidNavigatePrimaryMainFrame(foo3);
-
-  base::Uuid uuid = AddProductGroup(kCategoryLamp);
-  ProductGroup* product_group = (*GetProductGroupMap())[uuid].get();
-  ASSERT_EQ(0u, product_group->member_products.size());
-  ASSERT_EQ(2u, product_group->candidate_products.size());
-  ASSERT_EQ(product_group->candidate_products.count(foo1), 1u);
-  ASSERT_EQ(product_group->candidate_products.count(foo3), 1u);
-}
-
-TEST_F(ClusterManagerTest, RemoveProductGroup) {
-  base::Uuid uuid = AddProductGroup(kCategoryLamp);
-  GURL foo1(kTestUrl1);
-  GURL foo2(kTestUrl2);
-  GURL foo3(kTestUrl3);
-  UpdateUrlInfos(std::vector<GURL>{foo1, foo2, foo3});
-
-  UpdateProductInfo(kCategoryLamp);
-  cluster_manager_->DidNavigatePrimaryMainFrame(foo1);
-  UpdateProductInfo(kCategoryChair);
-  cluster_manager_->DidNavigatePrimaryMainFrame(foo2);
-  UpdateProductInfo(kCategoryLamp);
-  cluster_manager_->DidNavigatePrimaryMainFrame(foo3);
-  ASSERT_EQ(3u, GetCandidateProductMap()->size());
-
-  RemoveProductGroup(uuid);
-  ASSERT_FALSE((*GetProductGroupMap())[uuid]);
-  ASSERT_EQ(3u, GetCandidateProductMap()->size());
-}
-
-TEST_F(ClusterManagerTest, RemoveCandidateProductFromProductGroup) {
-  base::Uuid uuid = AddProductGroup(kCategoryLamp);
-  ProductGroup* product_group = (*GetProductGroupMap())[uuid].get();
-  GURL foo1(kTestUrl1);
-  GURL foo2(kTestUrl2);
-  GURL foo3(kTestUrl3);
-  UpdateUrlInfos(std::vector<GURL>{foo1, foo2, foo3});
-
-  // Add 3 products.
-  UpdateProductInfo(kCategoryLamp);
-  cluster_manager_->DidNavigatePrimaryMainFrame(foo1);
-  UpdateProductInfo(kCategoryChair);
-  cluster_manager_->DidNavigatePrimaryMainFrame(foo2);
-  UpdateProductInfo(kCategoryLamp);
-  cluster_manager_->DidNavigatePrimaryMainFrame(foo3);
-  ASSERT_EQ(3u, GetCandidateProductMap()->size());
-  ASSERT_EQ(2u, product_group->candidate_products.size());
-
-  // Remove product 3.
+  ASSERT_EQ(2u, GetCandidateProductMap()->size());
   UpdateUrlInfos(std::vector<GURL>{foo1, foo2});
   cluster_manager_->DidNavigateAway(foo3);
   ASSERT_EQ(2u, GetCandidateProductMap()->size());
 
-  ASSERT_EQ(0u, product_group->member_products.size());
-  ASSERT_EQ(1u, product_group->candidate_products.size());
-  ASSERT_EQ(product_group->candidate_products.count(foo1), 1u);
+  // Let GetProductInfo() for the 3rd product to complete.
+  base::RunLoop().RunUntilIdle();
+  ASSERT_EQ(2u, GetCandidateProductMap()->size());
+
+  CandidateProduct* product1 = (*GetCandidateProductMap())[foo1].get();
+  ASSERT_EQ(product1->similar_candidate_products_urls.size(), 0u);
+}
+
+TEST_F(ClusterManagerTest, FindSimilarCandidateProductsForProductGroup) {
+  base::Uuid uuid = AddProductSpecificationSet();
+  ProductGroup* product_group = (*GetProductGroupMap())[uuid].get();
+  ASSERT_EQ(1u, product_group->member_products.size());
+
+  GURL foo1(kTestUrl1);
+  GURL foo2(kTestUrl2);
+  GURL foo3(kTestUrl3);
+  UpdateUrlInfos(std::vector<GURL>{foo1, foo2, foo3});
+
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo1);
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo2);
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo3);
+  base::RunLoop().RunUntilIdle();
+  std::vector<GURL> candidates =
+      FindSimilarCandidateProductsForProductGroup(uuid);
+
+  ASSERT_EQ(1u, product_group->member_products.size());
+  ASSERT_EQ(2u, candidates.size());
+  ASSERT_TRUE(std::find(candidates.begin(), candidates.end(), foo1) !=
+              candidates.end());
+  ASSERT_TRUE(std::find(candidates.begin(), candidates.end(), foo3) !=
+              candidates.end());
+}
+
+TEST_F(ClusterManagerTest,
+       FindSimilarCandidateProductBeforeGetProductInfoCompletes) {
+  GURL foo1(kTestUrl1);
+  GURL foo2(kTestUrl2);
+  GURL foo3(kTestUrl3);
+  UpdateUrlInfos(std::vector<GURL>{foo1, foo2, foo3});
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo1);
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo2);
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo3);
+  base::RunLoop().RunUntilIdle();
+
+  base::Uuid uuid = AddProductSpecificationSet();
+  ProductGroup* product_group = (*GetProductGroupMap())[uuid].get();
+  ASSERT_EQ(1u, product_group->member_products.size());
+
+  // Before GetProductInfo() completes,
+  // FindSimilarCandidateProductsForProductGroup() should not find any matches.
+  FindSimilarCandidateProductsForProductGroup(uuid);
+  ASSERT_EQ(1u, product_group->member_products.size());
+
+  base::RunLoop().RunUntilIdle();
+  std::vector<GURL> candidates =
+      FindSimilarCandidateProductsForProductGroup(uuid);
+  ASSERT_EQ(1u, product_group->member_products.size());
+  ASSERT_EQ(2u, candidates.size());
+  ASSERT_TRUE(std::find(candidates.begin(), candidates.end(), foo1) !=
+              candidates.end());
+  ASSERT_TRUE(std::find(candidates.begin(), candidates.end(), foo3) !=
+              candidates.end());
+}
+
+TEST_F(ClusterManagerTest,
+       FindSimilarCandidateProductForMultiLabelProductGroup) {
+  ProductInfo product_info = ProductInfo();
+  product_info.category_data.add_product_categories()
+      ->add_category_labels()
+      ->set_category_default_label(kCategoryLamp);
+  product_info.category_data.add_product_categories()
+      ->add_category_labels()
+      ->set_category_default_label(kCategoryChair);
+  product_infos_[GURL(kProductUrl)] = product_info;
+
+  base::Uuid uuid = AddProductSpecificationSet();
+  ProductGroup* product_group = (*GetProductGroupMap())[uuid].get();
+  ASSERT_EQ(1u, product_group->member_products.size());
+  GURL foo1(kTestUrl1);
+  GURL foo2(kTestUrl2);
+  GURL foo3(kTestUrl3);
+  UpdateUrlInfos(std::vector<GURL>{foo1, foo2, foo3});
+
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo1);
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo2);
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo3);
+  base::RunLoop().RunUntilIdle();
+  std::vector<GURL> candidates =
+      FindSimilarCandidateProductsForProductGroup(uuid);
+
+  ASSERT_EQ(1u, product_group->member_products.size());
+  ASSERT_EQ(3u, candidates.size());
+  ASSERT_TRUE(std::find(candidates.begin(), candidates.end(), foo1) !=
+              candidates.end());
+  ASSERT_TRUE(std::find(candidates.begin(), candidates.end(), foo2) !=
+              candidates.end());
+  ASSERT_TRUE(std::find(candidates.begin(), candidates.end(), foo3) !=
+              candidates.end());
+}
+
+TEST_F(ClusterManagerTest, RemoveProductGroup) {
+  base::Uuid uuid = AddProductSpecificationSet();
+  GURL foo1(kTestUrl1);
+  GURL foo2(kTestUrl2);
+  GURL foo3(kTestUrl3);
+  UpdateUrlInfos(std::vector<GURL>{foo1, foo2, foo3});
+
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo1);
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo2);
+  cluster_manager_->DidNavigatePrimaryMainFrame(foo3);
+  base::RunLoop().RunUntilIdle();
+  ASSERT_EQ(3u, GetCandidateProductMap()->size());
+
+  RemoveProductSpecificationSet(uuid);
+  ASSERT_FALSE((*GetProductGroupMap())[uuid]);
+  ASSERT_EQ(3u, GetCandidateProductMap()->size());
 }
 
 }  // namespace commerce
diff --git a/components/commerce/core/compare/product_group.h b/components/commerce/core/compare/product_group.h
index a643644e..0ab7385 100644
--- a/components/commerce/core/compare/product_group.h
+++ b/components/commerce/core/compare/product_group.h
@@ -29,10 +29,6 @@
   // A set storing URLs of products that are currently in the group.
   std::set<GURL> member_products;
 
-  // A set storing URLs of products that are open and comparable to the
-  // product group, but is not currently in the group.
-  std::set<GURL> candidate_products;
-
   // Category infos of this group.
   std::vector<CategoryData> categories;
 };
diff --git a/components/compose/core/browser/compose_metrics.cc b/components/compose/core/browser/compose_metrics.cc
index 40056973..28201643 100644
--- a/components/compose/core/browser/compose_metrics.cc
+++ b/components/compose/core/browser/compose_metrics.cc
@@ -122,6 +122,10 @@
     base::UmaHistogramEnumeration(histogram,
                                   ComposeSessionEventTypes::kRedoClicked);
   }
+  if (session_events.result_edit_count > 0) {
+    base::UmaHistogramEnumeration(histogram,
+                                  ComposeSessionEventTypes::kResultEdited);
+  }
   bool has_used_modifier = false;
   if (session_events.shorten_count > 0) {
     has_used_modifier = true;
@@ -159,6 +163,10 @@
     base::UmaHistogramEnumeration(histogram,
                                   ComposeSessionEventTypes::kInsertClicked);
   }
+  if (session_events.edited_result_inserted) {
+    base::UmaHistogramEnumeration(
+        histogram, ComposeSessionEventTypes::kEditedResultInserted);
+  }
   if (session_events.close_clicked) {
     base::UmaHistogramEnumeration(histogram,
                                   ComposeSessionEventTypes::kCloseClicked);
diff --git a/components/compose/core/browser/compose_metrics.h b/components/compose/core/browser/compose_metrics.h
index 4a5c8104..624dcb2d 100644
--- a/components/compose/core/browser/compose_metrics.h
+++ b/components/compose/core/browser/compose_metrics.h
@@ -122,7 +122,9 @@
   kCancelEditClicked = 20,
   kAnyModifierUsed = 21,
   kRedoClicked = 22,
-  kMaxValue = kRedoClicked,
+  kResultEdited = 23,
+  kEditedResultInserted = 24,
+  kMaxValue = kEditedResultInserted,
 };
 
 // Enum for recording the show status of the Compose context menu item.
@@ -204,9 +206,11 @@
   unsigned int undo_count = 0;
   // Times the user has pressed "redo" this session.
   unsigned int redo_count = 0;
+  // Times the user has edited the result text this session.
+  unsigned int result_edit_count = 0;
   // Compose request after input edited.
   unsigned int update_input_count = 0;
-  // Tiems the user has pressed the "Retry" button.
+  // Times the user has pressed the "Retry" button.
   unsigned int regenerate_count = 0;
   // Times the user has picked the "Shorter" option.
   unsigned int shorten_count = 0;
@@ -234,6 +238,8 @@
 
   // True if the results were eventually inserted back to the web page.
   bool inserted_results = false;
+  // True if an edited result was eventually inserted back to the web page.
+  bool edited_result_inserted = false;
   // True if the the user closed the compose session via the "x" button.
   bool close_clicked = false;
   // True if the user has pressed the "Edit" button this session.
diff --git a/components/external_intents/android/BUILD.gn b/components/external_intents/android/BUILD.gn
index 89c0a842..6a755a0 100644
--- a/components/external_intents/android/BUILD.gn
+++ b/components/external_intents/android/BUILD.gn
@@ -32,6 +32,7 @@
     "//services/network/public/mojom:url_loader_base_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_appcompat_appcompat_java",
+    "//third_party/blink/public/mojom:web_feature_mojo_bindings_java",
     "//third_party/jni_zero:jni_zero_java",
     "//ui/android:ui_java",
     "//url:gurl_java",
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
index 8510b0d7..8d54620 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
@@ -17,11 +17,13 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.blink.mojom.WebFeature;
 import org.chromium.components.embedder_support.util.UrlUtilities;
 import org.chromium.components.external_intents.ExternalNavigationHandler.OverrideUrlLoadingResult;
 import org.chromium.components.external_intents.ExternalNavigationHandler.OverrideUrlLoadingResultType;
 import org.chromium.components.external_intents.ExternalNavigationParams.AsyncActionTakenParams;
 import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
+import org.chromium.content_public.browser.ContentWebFeatureUsageUtils;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.NavigationController;
 import org.chromium.content_public.browser.NavigationHandle;
@@ -39,11 +41,10 @@
 
 /**
  * Class that controls navigations and allows to intercept them. It is used on Android to 'convert'
- * certain navigations to Intents to 3rd party applications.
- * Note the Intent is often created together with a new empty tab which then should be closed
- * immediately. Closing the tab will cancel the navigation that this delegate is running for,
- * hence can cause UAF error. It should be done in an asynchronous fashion to avoid it.
- * See https://crbug.com/732260.
+ * certain navigations to Intents to 3rd party applications. Note the Intent is often created
+ * together with a new empty tab which then should be closed immediately. Closing the tab will
+ * cancel the navigation that this delegate is running for, hence can cause UAF error. It should be
+ * done in an asynchronous fashion to avoid it. See https://crbug.com/732260.
  */
 @JNINamespace("external_intents")
 public class InterceptNavigationDelegateImpl extends InterceptNavigationDelegate {
@@ -327,8 +328,26 @@
             scheme = InterceptScheme.INTENT_SCHEME;
         } else if (MDOC_SCHEME.equals(escapedUrl.getScheme())) {
             scheme = InterceptScheme.MDOC_SCHEME;
+            ContentWebFeatureUsageUtils.logWebFeatureForCurrentPage(
+                    mClient.getWebContents(), WebFeature.IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK);
+            // Record spread of `result` in order to get an idea of by how much the
+            // IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK use counter is over counting as a user may
+            // cancel the OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION dialog.
+            RecordHistogram.recordEnumeratedHistogram(
+                    "Android.TabNavigationInterceptResult.ForMdoc",
+                    result.getResultType(),
+                    OverrideUrlLoadingResultType.NUM_ENTRIES);
         } else if (escapedUrl.getScheme().endsWith(OPENID4VP_SCHEME_SUFFIX)) {
             scheme = InterceptScheme.OPENID4VP_SCHEME;
+            ContentWebFeatureUsageUtils.logWebFeatureForCurrentPage(
+                    mClient.getWebContents(), WebFeature.IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK);
+            // Record spread of `result` in order to get an idea of by how much the
+            // IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK use counter is over counting as a user may
+            // cancel the OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION dialog.
+            RecordHistogram.recordEnumeratedHistogram(
+                    "Android.TabNavigationInterceptResult.ForOpenId4Vp",
+                    result.getResultType(),
+                    OverrideUrlLoadingResultType.NUM_ENTRIES);
         }
         RecordHistogram.recordEnumeratedHistogram(
                 "Android.TabNavigationIntercept.Scheme", scheme, InterceptScheme.NUM_ENTRIES);
diff --git a/components/history_embeddings/history_embeddings_service.cc b/components/history_embeddings/history_embeddings_service.cc
index a4cdf12..4ecd98f 100644
--- a/components/history_embeddings/history_embeddings_service.cc
+++ b/components/history_embeddings/history_embeddings_service.cc
@@ -14,6 +14,7 @@
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "base/time/time.h"
+#include "base/timer/elapsed_timer.h"
 #include "components/history/core/browser/history_types.h"
 #include "components/history/core/browser/url_database.h"
 #include "components/history/core/browser/url_row.h"
@@ -226,7 +227,8 @@
     Embedding query_embedding,
     std::optional<base::Time> time_range_start,
     size_t count) {
-  std::vector<ScoredUrl> scored_urls = sql_database.FindNearest(
+  base::ElapsedTimer timer;
+  SearchInfo search_info = sql_database.FindNearest(
       time_range_start, count, std::move(query_embedding),
       base::BindRepeating(
           [](base::WeakPtr<std::atomic<size_t>> weak_latest_query_id,
@@ -237,9 +239,17 @@
             return !weak_latest_query_id || *weak_latest_query_id != query_id;
           },
           std::move(weak_latest_query_id), query_id));
+  base::UmaHistogramTimes("History.Embeddings.Search.Duration",
+                          timer.Elapsed());
+  base::UmaHistogramCounts1M("History.Embeddings.Search.UrlCount",
+                             search_info.searched_url_count);
+  base::UmaHistogramCounts10M("History.Embeddings.Search.EmbeddingCount",
+                              search_info.searched_embedding_count);
+  base::UmaHistogramBoolean("History.Embeddings.Search.Completed",
+                            search_info.completed);
 
   // Populate source passages.
-  for (ScoredUrl& scored_url : scored_urls) {
+  for (ScoredUrl& scored_url : search_info.scored_urls) {
     std::optional<proto::PassagesValue> value =
         sql_database.GetPassages(scored_url.url_id);
     if (value &&
@@ -248,7 +258,7 @@
     }
   }
 
-  return scored_urls;
+  return std::move(search_info.scored_urls);
 }
 
 void HistoryEmbeddingsService::Storage::HandleHistoryDeletions(
diff --git a/components/history_embeddings/history_embeddings_service_unittest.cc b/components/history_embeddings/history_embeddings_service_unittest.cc
index b2e1772..93dc307 100644
--- a/components/history_embeddings/history_embeddings_service_unittest.cc
+++ b/components/history_embeddings/history_embeddings_service_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/run_loop.h"
 #include "base/task/cancelable_task_tracker.h"
 #include "base/test/bind.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
@@ -21,9 +22,11 @@
 #include "components/history/core/test/history_service_test_util.h"
 #include "components/history_embeddings/history_embeddings_features.h"
 #include "components/history_embeddings/vector_database.h"
+#include "components/optimization_guide/core/test_model_info_builder.h"
 #include "components/optimization_guide/core/test_optimization_guide_model_provider.h"
 #include "components/os_crypt/sync/os_crypt_mocker.h"
 #include "components/page_content_annotations/core/test_page_content_annotations_service.h"
+#include "components/page_content_annotations/core/test_page_content_annotator.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace history_embeddings {
@@ -52,6 +55,21 @@
 
   void TearDown() override { OSCryptMocker::TearDown(); }
 
+  void OverrideVisibilityScoresForTesting(
+      const base::flat_map<std::string, double>& visibility_scores_for_input) {
+    std::unique_ptr<optimization_guide::ModelInfo> model_info =
+        optimization_guide::TestModelInfoBuilder()
+            .SetModelFilePath(
+                base::FilePath(FILE_PATH_LITERAL("visibility_model")))
+            .SetVersion(123)
+            .Build();
+    CHECK(model_info);
+    page_content_annotator_.UseVisibilityScores(*model_info,
+                                                visibility_scores_for_input);
+    page_content_annotations_service_->OverridePageContentAnnotatorForTesting(
+        &page_content_annotator_);
+  }
+
   size_t CountEmbeddingsRows(HistoryEmbeddingsService* service) {
     size_t result = 0;
     base::RunLoop loop;
@@ -84,6 +102,7 @@
       optimization_guide_model_provider_;
   std::unique_ptr<page_content_annotations::TestPageContentAnnotationsService>
       page_content_annotations_service_;
+  page_content_annotations::TestPageContentAnnotator page_content_annotator_;
 };
 
 TEST_F(HistoryEmbeddingsServiceTest, ConstructsAndInvalidatesWeakPtr) {
@@ -143,4 +162,22 @@
   EXPECT_EQ(CountEmbeddingsRows(service.get()), 0U);
 }
 
+TEST_F(HistoryEmbeddingsServiceTest, SearchReportsHistograms) {
+  base::HistogramTester histogram_tester;
+  auto service = std::make_unique<HistoryEmbeddingsService>(
+      history_service_.get(), page_content_annotations_service_.get());
+
+  base::test::TestFuture<SearchResult> future;
+  OverrideVisibilityScoresForTesting({{"", 0.99}});
+  service->Search("", {}, 1, future.GetCallback());
+  EXPECT_TRUE(future.Take().empty());
+
+  histogram_tester.ExpectUniqueSample("History.Embeddings.Search.Completed",
+                                      true, 1);
+  histogram_tester.ExpectUniqueSample("History.Embeddings.Search.UrlCount", 0,
+                                      1);
+  histogram_tester.ExpectUniqueSample(
+      "History.Embeddings.Search.EmbeddingCount", 0, 1);
+}
+
 }  // namespace history_embeddings
diff --git a/components/history_embeddings/sql_database_unittest.cc b/components/history_embeddings/sql_database_unittest.cc
index def6a0d2..7c827516 100644
--- a/components/history_embeddings/sql_database_unittest.cc
+++ b/components/history_embeddings/sql_database_unittest.cc
@@ -166,39 +166,53 @@
 
   // An ordinary search with full results:
   {
-    std::vector<ScoredUrl> scored_urls = sql_database->FindNearest(
-        {}, 3, query, base::BindRepeating([]() { return false; }));
+    std::vector<ScoredUrl> scored_urls =
+        sql_database
+            ->FindNearest({}, 3, query,
+                          base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 3u);
   }
 
   // Narrowed searches with time range.
   {
-    std::vector<ScoredUrl> scored_urls = sql_database->FindNearest(
-        now, 3, query, base::BindRepeating([]() { return false; }));
+    std::vector<ScoredUrl> scored_urls =
+        sql_database
+            ->FindNearest(now, 3, query,
+                          base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 3u);
   }
   {
     std::vector<ScoredUrl> scored_urls =
-        sql_database->FindNearest(now + base::Seconds(30), 3, query,
-                                  base::BindRepeating([]() { return false; }));
+        sql_database
+            ->FindNearest(now + base::Seconds(30), 3, query,
+                          base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 2u);
   }
   {
     std::vector<ScoredUrl> scored_urls =
-        sql_database->FindNearest(now + base::Seconds(90), 3, query,
-                                  base::BindRepeating([]() { return false; }));
+        sql_database
+            ->FindNearest(now + base::Seconds(90), 3, query,
+                          base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 1u);
   }
   {
     std::vector<ScoredUrl> scored_urls =
-        sql_database->FindNearest(now + base::Minutes(2), 3, query,
-                                  base::BindRepeating([]() { return false; }));
+        sql_database
+            ->FindNearest(now + base::Minutes(2), 3, query,
+                          base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 1u);
   }
   {
     std::vector<ScoredUrl> scored_urls =
-        sql_database->FindNearest(now + base::Seconds(121), 3, query,
-                                  base::BindRepeating([]() { return false; }));
+        sql_database
+            ->FindNearest(now + base::Seconds(121), 3, query,
+                          base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 0u);
   }
 }
diff --git a/components/history_embeddings/vector_database.cc b/components/history_embeddings/vector_database.cc
index 7188acf..109b100 100644
--- a/components/history_embeddings/vector_database.cc
+++ b/components/history_embeddings/vector_database.cc
@@ -98,7 +98,13 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-std::vector<ScoredUrl> VectorDatabase::FindNearest(
+SearchInfo::SearchInfo() = default;
+SearchInfo::SearchInfo(SearchInfo&&) = default;
+SearchInfo::~SearchInfo() = default;
+
+////////////////////////////////////////////////////////////////////////////////
+
+SearchInfo VectorDatabase::FindNearest(
     std::optional<base::Time> time_range_start,
     size_t count,
     const Embedding& query,
@@ -127,8 +133,11 @@
   };
   std::priority_queue<ScoredUrl, std::vector<ScoredUrl>, Compare> q;
 
+  SearchInfo search_info;
+  search_info.completed = true;
   while (const UrlEmbeddings* item = iterator->Next()) {
     if (is_search_halted.Run()) {
+      search_info.completed = false;
       break;
     }
     while (q.size() > count) {
@@ -142,15 +151,16 @@
         .score = score,
         .index = score_index,
     });
+    search_info.searched_url_count++;
+    search_info.searched_embedding_count += item->embeddings.size();
   }
 
   // Empty queue into vector and return result.
-  std::vector<ScoredUrl> nearest;
   while (!q.empty()) {
-    nearest.push_back(q.top());
+    search_info.scored_urls.push_back(q.top());
     q.pop();
   }
-  return nearest;
+  return search_info;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/components/history_embeddings/vector_database.h b/components/history_embeddings/vector_database.h
index fbffd508..4756d46 100644
--- a/components/history_embeddings/vector_database.h
+++ b/components/history_embeddings/vector_database.h
@@ -100,6 +100,25 @@
   std::string passage;
 };
 
+struct SearchInfo {
+  SearchInfo();
+  SearchInfo(SearchInfo&&);
+  ~SearchInfo();
+
+  // Result of the search, the best scored URLs.
+  std::vector<ScoredUrl> scored_urls;
+
+  // The number of URLs searched to find this result.
+  size_t searched_url_count = 0u;
+
+  // The number of embeddings searched to find this result.
+  size_t searched_embedding_count = 0u;
+
+  // Whether the search completed without interruption. Starting a new search
+  // may cause a search to halt, and in that case this member will be false.
+  bool completed = false;
+};
+
 // This base class decouples storage classes and inverts the dependency so that
 // a vector database can work with a SQLite database, simple in-memory storage,
 // flat files, or whatever kinds of storage will work efficiently.
@@ -130,11 +149,10 @@
 
   // Searches the database for embeddings near given `query` and returns
   // information about where they were found and how nearly the query matched.
-  std::vector<ScoredUrl> FindNearest(
-      std::optional<base::Time> time_range_start,
-      size_t count,
-      const Embedding& query,
-      base::RepeatingCallback<bool()> is_search_halted);
+  SearchInfo FindNearest(std::optional<base::Time> time_range_start,
+                         size_t count,
+                         const Embedding& query,
+                         base::RepeatingCallback<bool()> is_search_halted);
 };
 
 // This is an in-memory vector store that supports searching and saving to
diff --git a/components/history_embeddings/vector_database_unittest.cc b/components/history_embeddings/vector_database_unittest.cc
index a3fe931b..fce61ee 100644
--- a/components/history_embeddings/vector_database_unittest.cc
+++ b/components/history_embeddings/vector_database_unittest.cc
@@ -61,8 +61,11 @@
 
   // An ordinary search with full results:
   {
-    std::vector<ScoredUrl> scored_urls = database.FindNearest(
-        {}, 3, query, base::BindRepeating([]() { return false; }));
+    std::vector<ScoredUrl> scored_urls =
+        database
+            .FindNearest({}, 3, query,
+                         base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 3u);
   }
 
@@ -71,13 +74,15 @@
     std::atomic<size_t> counter(0u);
     base::WeakPtrFactory<std::atomic<size_t>> weak_factory(&counter);
     std::vector<ScoredUrl> scored_urls =
-        database.FindNearest({}, 3, query,
-                             base::BindRepeating(
-                                 [](auto weak_counter) {
-                                   (*weak_counter)++;
-                                   return *weak_counter > 2u;
-                                 },
-                                 weak_factory.GetWeakPtr()));
+        database
+            .FindNearest({}, 3, query,
+                         base::BindRepeating(
+                             [](auto weak_counter) {
+                               (*weak_counter)++;
+                               return *weak_counter > 2u;
+                             },
+                             weak_factory.GetWeakPtr()))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 2u);
   }
 }
@@ -96,39 +101,53 @@
 
   // An ordinary search with full results:
   {
-    std::vector<ScoredUrl> scored_urls = database.FindNearest(
-        {}, 3, query, base::BindRepeating([]() { return false; }));
+    std::vector<ScoredUrl> scored_urls =
+        database
+            .FindNearest({}, 3, query,
+                         base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 3u);
   }
 
   // Narrowed searches with time range.
   {
-    std::vector<ScoredUrl> scored_urls = database.FindNearest(
-        now, 3, query, base::BindRepeating([]() { return false; }));
+    std::vector<ScoredUrl> scored_urls =
+        database
+            .FindNearest(now, 3, query,
+                         base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 3u);
   }
   {
     std::vector<ScoredUrl> scored_urls =
-        database.FindNearest(now + base::Seconds(30), 3, query,
-                             base::BindRepeating([]() { return false; }));
+        database
+            .FindNearest(now + base::Seconds(30), 3, query,
+                         base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 2u);
   }
   {
     std::vector<ScoredUrl> scored_urls =
-        database.FindNearest(now + base::Seconds(90), 3, query,
-                             base::BindRepeating([]() { return false; }));
+        database
+            .FindNearest(now + base::Seconds(90), 3, query,
+                         base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 1u);
   }
   {
     std::vector<ScoredUrl> scored_urls =
-        database.FindNearest(now + base::Minutes(2), 3, query,
-                             base::BindRepeating([]() { return false; }));
+        database
+            .FindNearest(now + base::Minutes(2), 3, query,
+                         base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 1u);
   }
   {
     std::vector<ScoredUrl> scored_urls =
-        database.FindNearest(now + base::Seconds(121), 3, query,
-                             base::BindRepeating([]() { return false; }));
+        database
+            .FindNearest(now + base::Seconds(121), 3, query,
+                         base::BindRepeating([]() { return false; }))
+            .scored_urls;
     CHECK_EQ(scored_urls.size(), 0u);
   }
 }
diff --git a/components/live_caption/views/caption_bubble.cc b/components/live_caption/views/caption_bubble.cc
index 6a3a92e..74562be 100644
--- a/components/live_caption/views/caption_bubble.cc
+++ b/components/live_caption/views/caption_bubble.cc
@@ -536,7 +536,11 @@
 CaptionBubble::CaptionBubble(PrefService* profile_prefs,
                              const std::string& application_locale,
                              base::OnceClosure destroyed_callback)
-    : profile_prefs_(profile_prefs),
+    : views::BubbleDialogDelegateView(nullptr,
+                                      views::BubbleBorder::TOP_LEFT,
+                                      views::BubbleBorder::DIALOG_SHADOW,
+                                      true),
+      profile_prefs_(profile_prefs),
       destroyed_callback_(std::move(destroyed_callback)),
       application_locale_(application_locale),
       is_expanded_(
@@ -1517,7 +1521,6 @@
 void CaptionBubble::Redraw() {
   UpdateBubbleAndTitleVisibility();
   UpdateContentSize();
-  SizeToContents();
 }
 
 void CaptionBubble::ShowInactive() {
diff --git a/components/performance_manager/embedder/graph_features.h b/components/performance_manager/embedder/graph_features.h
index 82da10a..9d36131 100644
--- a/components/performance_manager/embedder/graph_features.h
+++ b/components/performance_manager/embedder/graph_features.h
@@ -51,7 +51,6 @@
       bool site_data_recorder : 1;
       bool tab_connectedness_decorator : 1;
       bool tab_page_decorator : 1;
-      bool tab_properties_decorator : 1;
       bool v8_context_tracker : 1;
     };
   };
@@ -120,11 +119,6 @@
     return *this;
   }
 
-  constexpr GraphFeatures& EnableTabPropertiesDecorator() {
-    flags_.tab_properties_decorator = true;
-    return *this;
-  }
-
   constexpr GraphFeatures& EnableV8ContextTracker() {
     EnableExecutionContextRegistry();
     flags_.v8_context_tracker = true;
@@ -153,7 +147,6 @@
     EnableSiteDataRecorder();
     EnableTabConnectednessDecorator();
     EnableTabPageDecorator();
-    EnableTabPropertiesDecorator();
     EnableV8ContextTracker();
     return *this;
   }
diff --git a/components/user_education/views/help_bubble_view.cc b/components/user_education/views/help_bubble_view.cc
index 512982d3..1e4bf22 100644
--- a/components/user_education/views/help_bubble_view.cc
+++ b/components/user_education/views/help_bubble_view.cc
@@ -520,7 +520,8 @@
           features::IsChromeRefresh2023() ? views::BubbleBorder::DIALOG_SHADOW
                                           : views::BubbleBorder::STANDARD_SHADOW
 #endif
-          ),
+          ,
+          true),
       delegate_(delegate) {
   if (anchor.rect.has_value()) {
     SetForceAnchorRect(anchor.rect.value());
@@ -883,7 +884,9 @@
   // b/303069420).
   frame_view->bubble_border()->set_draw_border_stroke(false);
 
-  SizeToContents();
+  // TODO(crbug.com/41493925) Remove this InvalidateLayout() once the border
+  // invalidate itself when it changes.
+  InvalidateLayout();
 
   // Most help bubbles with buttons take focus when they show.
   bool show_active =
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index dfcda910..e0aea41 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -3045,6 +3045,7 @@
       "android/content_url_loader_factory.cc",
       "android/content_url_loader_factory.h",
       "android/content_view_statics.cc",
+      "android/content_web_feature_usage_utils_android.cc",
       "android/devtools_auth.cc",
       "android/dialog_overlay_impl.cc",
       "android/dialog_overlay_impl.h",
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm
index 61264ae..bef4e91 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.mm
+++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -1595,8 +1595,8 @@
     return nil;
   }
   if (!root_manager->GetParentView()) {
-    // TODO(crbug.com/1425682) Find out why this happens, there should always be
-    // a parent view. This used to be a CHECK() but caused too many crashes.
+    // TODO(crbug.com/40898856) Find out why this happens, there should always
+    // be a parent view. This used to be a CHECK() but caused too many crashes.
     // Repro steps are available in the bug.
     return nil;
   }
diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
index c86c221..94a2395 100644
--- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
+++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
@@ -1503,7 +1503,7 @@
   TestLocalizedLandmarkType(17, ax::mojom::Role::kSearch, "search");
 }
 
-// TODO(https://crbug.com/1020456) re-enable when crashing on linux is resolved.
+// TODO(crbug.com/40656480) re-enable when crashing on linux is resolved.
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 #define MAYBE_LocalizedRoleDescription DISABLED_LocalizedRoleDescription
 #else
diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
index cae01e62..96201e12 100644
--- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
@@ -711,7 +711,7 @@
   RunEventTest(FILE_PATH_LITERAL("expanded-changed.html"));
 }
 
-// TODO(crbug.com/1423530): disabled on UIA.
+// TODO(crbug.com/40897549): disabled on UIA.
 // TODO(crbug.com/1423845): Failing on Mac.
 // TODO(crbug.com/1423845): Actually failing everywhere. Disabled.
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTestExceptUIA,
@@ -883,7 +883,7 @@
   RunEventTest(FILE_PATH_LITERAL("menulist-collapse-next.html"));
 }
 
-// TODO(crbug/1232295): Flaky on Linux and Win.
+// TODO(crbug.com/40780161): Flaky on Linux and Win.
 // TODO(crbug.com/1230894): locks up with popup open, only on Mac
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
 #define MAYBE_AccessibilityEventsMenuListExpand \
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 3187c1a0..3f8a07f9 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -159,7 +159,7 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
-// TODO(https://crbug.com/1470120): We need to create a way to incrementally
+// TODO(crbug.com/40925629): We need to create a way to incrementally
 // enable and create UIA tests.
 INSTANTIATE_TEST_SUITE_P(
     All,
@@ -1619,7 +1619,7 @@
   RunHtmlTest(FILE_PATH_LITERAL("aside-inside-section-role-generic.html"));
 }
 
-// TODO(crbug.com/1502854): Fix failure on android
+// TODO(crbug.com/40943250): Fix failure on android
 #if BUILDFLAG(IS_ANDROID)
 #define MAYBE_AccessibilityAudio DISABLED_AccessibilityAudio
 #else
@@ -2360,7 +2360,7 @@
 
 // TODO: date and time controls drop their children, including the popup button,
 // on Android.
-// TODO(https://crbug.com/1378498): Flaky on every platform.
+// TODO(crbug.com/40875029): Flaky on every platform.
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        DISABLED_AccessibilityInputDateWithPopupOpen) {
   RunHtmlTest(FILE_PATH_LITERAL("input-date-with-popup-open.html"));
@@ -2617,8 +2617,8 @@
 }
 
 #if BUILDFLAG(IS_MAC)
-// TODO(1038813): The /blink test pass is different on Windows and Mac, versus
-// Linux. Also, see https://crbug.com/1314896.
+// TODO(crbug.com/40666501): The /blink test pass is different on Windows and
+// Mac, versus Linux. Also, see https://crbug.com/1314896.
 #define MAYBE_AccessibilityInputTime DISABLED_AccessibilityInputTime
 #else
 #define MAYBE_AccessibilityInputTime AccessibilityInputTime
@@ -3503,7 +3503,7 @@
   RunHtmlTest(FILE_PATH_LITERAL("node-changed-crash-in-editable-text.html"));
 }
 
-// TODO(https://crbug.com/1366446): This test is failing on Android.
+// TODO(crbug.com/40866942): This test is failing on Android.
 #if BUILDFLAG(IS_ANDROID)
 #define MAYBE_AccessibilityNoSourceVideo DISABLED_AccessibilityNoSourceVideo
 #else
diff --git a/content/browser/accessibility/hit_testing_browsertest.cc b/content/browser/accessibility/hit_testing_browsertest.cc
index 1bc08c0f..0bb1b8e 100644
--- a/content/browser/accessibility/hit_testing_browsertest.cc
+++ b/content/browser/accessibility/hit_testing_browsertest.cc
@@ -635,8 +635,8 @@
 }
 
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_MAC)
-// Fails flakily with compared ID differences. TODO(crbug.com/1121099): Re-enable
-// this test.
+// Fails flakily with compared ID differences. TODO(crbug.com/40715277):
+// Re-enable this test.
 IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingBrowserTest,
                        DISABLED_CachingAsyncHitTest_WithPinchZoom) {
   ASSERT_TRUE(embedded_test_server()->Start());
@@ -682,7 +682,7 @@
 
 // TODO(https://crbug.com/1224978): Times out flakily on TSAN builds.
 // TODO(https://crbug.com/1459570): Times out flakily on ASan builds.
-// TODO(https://crbug.com/1461935): Times out flakily on win-asan.
+// TODO(crbug.com/40921699): Times out flakily on win-asan.
 IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingBrowserTest,
                        DISABLED_HitTest_WithPinchZoom) {
   ASSERT_TRUE(embedded_test_server()->Start());
diff --git a/content/browser/android/content_web_feature_usage_utils_android.cc b/content/browser/android/content_web_feature_usage_utils_android.cc
new file mode 100644
index 0000000..942986d
--- /dev/null
+++ b/content/browser/android/content_web_feature_usage_utils_android.cc
@@ -0,0 +1,24 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_android.h"
+#include "content/browser/web_contents/web_contents_android.h"
+#include "content/public/android/content_jni_headers/ContentWebFeatureUsageUtils_jni.h"
+#include "content/public/browser/content_browser_client.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/content_client.h"
+
+namespace content {
+
+static void JNI_ContentWebFeatureUsageUtils_LogWebFeatureForCurrentPage(
+    JNIEnv* env,
+    const jni_zero::JavaParamRef<jobject>& jweb_contents,
+    jint web_feature) {
+  WebContents* web_contents = WebContents::FromJavaWebContents(jweb_contents);
+  GetContentClient()->browser()->LogWebFeatureForCurrentPage(
+      web_contents->GetPrimaryMainFrame(),
+      static_cast<blink::mojom::WebFeature>(web_feature));
+}
+
+}  // namespace content
diff --git a/content/browser/bluetooth/web_bluetooth_pairing_manager_impl.cc b/content/browser/bluetooth/web_bluetooth_pairing_manager_impl.cc
index f453376..0d5f1bf 100644
--- a/content/browser/bluetooth/web_bluetooth_pairing_manager_impl.cc
+++ b/content/browser/bluetooth/web_bluetooth_pairing_manager_impl.cc
@@ -102,10 +102,10 @@
 
 constexpr int WebBluetoothPairingManagerImpl::kMaxPairAttempts;
 
-// TODO(960258): Ensure this delegate outlives any in-progress pairing operation
-// for which it is used. Additionally review use of WebBluetoothDeviceId vs.
-// BluetoothDevice as well as how to deal with simultaneous pairing requests
-// for the same device.
+// TODO(crbug.com/40626253): Ensure this delegate outlives any in-progress
+// pairing operation for which it is used. Additionally review use of
+// WebBluetoothDeviceId vs. BluetoothDevice as well as how to deal with
+// simultaneous pairing requests for the same device.
 WebBluetoothPairingManagerImpl::WebBluetoothPairingManagerImpl(
     WebBluetoothPairingManagerDelegate* pairing_manager_delegate)
     : pairing_manager_delegate_(pairing_manager_delegate) {
diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc
index 50a777e..fb0844c 100644
--- a/content/browser/browser_child_process_host_impl.cc
+++ b/content/browser/browser_child_process_host_impl.cc
@@ -570,7 +570,7 @@
   }
 
   // This class is not expected to be used for renderer child processes.
-  // TODO(crbug/1028263): CHECK, once proven that this scenario does not
+  // TODO(crbug.com/40109064): CHECK, once proven that this scenario does not
   // occur in the wild, else remove dump and just return early if disproven.
   if (data_.process_type == PROCESS_TYPE_RENDERER) {
     base::debug::DumpWithoutCrashing();
diff --git a/content/browser/browsing_data/browsing_data_remover_impl.cc b/content/browser/browsing_data/browsing_data_remover_impl.cc
index d2d2ac5..4448e43 100644
--- a/content/browser/browsing_data/browsing_data_remover_impl.cc
+++ b/content/browser/browsing_data/browsing_data_remover_impl.cc
@@ -539,7 +539,7 @@
 
     RenderProcessHostImpl::ClearAllResourceCaches();
 
-    // TODO(crbug.com/813882): implement retry on network service.
+    // TODO(crbug.com/40563720): implement retry on network service.
 
     // The clearing of the HTTP cache happens in the network service process
     // when enabled. Note that we've deprecated the concept of a media cache,
@@ -613,7 +613,7 @@
 
   //////////////////////////////////////////////////////////////////////////////
   // Reporting cache.
-  // TODO(https://crbug.com/1291489): Add unit test to cover this.
+  // TODO(crbug.com/40818785): Add unit test to cover this.
   if (remove_mask & DATA_TYPE_COOKIES) {
     network::mojom::NetworkContext* network_context =
         storage_partition->GetNetworkContext();
diff --git a/content/browser/browsing_topics/browsing_topics_browsertest.cc b/content/browser/browsing_topics/browsing_topics_browsertest.cc
index 5b67eb4..c23e7c1 100644
--- a/content/browser/browsing_topics/browsing_topics_browsertest.cc
+++ b/content/browser/browsing_topics/browsing_topics_browsertest.cc
@@ -190,7 +190,7 @@
   EXPECT_EQ("[]", InvokeTopicsAPI(web_contents()));
 }
 
-// TODO(crbug.com/1381167): migrate to WPT.
+// TODO(crbug.com/40245082): migrate to WPT.
 IN_PROC_BROWSER_TEST_F(BrowsingTopicsBrowserTest,
                        Fetch_TopicsHeaderNotVisibleInServiceWorker) {
   GURL main_frame_url = https_server_.GetURL(
diff --git a/content/browser/cache_storage/cache_storage_manager_unittest.cc b/content/browser/cache_storage/cache_storage_manager_unittest.cc
index c8c0cad..44d597d 100644
--- a/content/browser/cache_storage/cache_storage_manager_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_manager_unittest.cc
@@ -1873,7 +1873,7 @@
   EXPECT_NE(Size(bucket_locator1_), 0);
 }
 
-// TODO(crbug.com/1369300): Re-enable test for Windows.
+// TODO(crbug.com/40868994): Re-enable test for Windows.
 #if BUILDFLAG(IS_WIN)
 #define MAYBE_GetBucketUsageWithPadding DISABLED_GetBucketUsageWithPadding
 #else
diff --git a/content/browser/child_process_launcher_helper.cc b/content/browser/child_process_launcher_helper.cc
index 5c497a1f..5513503 100644
--- a/content/browser/child_process_launcher_helper.cc
+++ b/content/browser/child_process_launcher_helper.cc
@@ -69,7 +69,7 @@
     [[maybe_unused]] base::CommandLine* command_line,
     [[maybe_unused]] base::LaunchOptions* launch_options,
     [[maybe_unused]] FileMappedForLaunch* files_to_register) {
-  // TODO(crbug.com/1028263): Once all process types support histogram shared
+  // TODO(crbug.com/40109064): Once all process types support histogram shared
   // memory being passed at launch, remove this if.
   if (!histogram_memory_region.IsValid()) {
     return;
@@ -78,7 +78,7 @@
   CHECK(command_line);
   CHECK(histogram_memory_region.IsValid());
 #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE)
-  // TODO(crbug.com/1028263): content::FileMappedForLaunch (POSIX) is redundant
+  // TODO(crbug.com/40109064): content::FileMappedForLaunch (POSIX) is redundant
   // wrt the base::LaunchOptions::<platform-specific-handles-to-transfer>
   // members. Refactor this so that the details of base::Launch vs Zygote on
   // (some) POSIX platforms is an implementation detail and not exposed here.
@@ -122,7 +122,7 @@
     [[maybe_unused]] FileMappedForLaunch* files_to_register) {
   CHECK(command_line);
 #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE)
-  // TODO(crbug.com/1028263): content::FileMappedForLaunch (POSIX) is redundant
+  // TODO(crbug.com/40109064): content::FileMappedForLaunch (POSIX) is redundant
   // wrt the base::LaunchOptions::<platform-specific-handles-to-transfer>
   // members. Refactor this so that the details of base::Launch vs Zygote on
   // (some) POSIX platforms is an implementation detail and not exposed here.
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
index 4230fb5..fa80df8e 100644
--- a/content/browser/child_process_security_policy_impl.cc
+++ b/content/browser/child_process_security_policy_impl.cc
@@ -1917,7 +1917,7 @@
         // require COOP/COEP handling, to pass in their COOP/COEP information
         // so it can be used here instead of the values in
         // |actual_process_lock|.
-        // TODO(crbug.com/1271197): The code below is subtly incorrect in cases
+        // TODO(crbug.com/40205612): The code below is subtly incorrect in cases
         // where actual_process_lock.is_pdf() is true, since in the case of PDFs
         // the lock is intended to prevent access to the lock's site/origin,
         // while still allowing the navigation to commit.
diff --git a/content/browser/devtools/network_service_devtools_observer.cc b/content/browser/devtools/network_service_devtools_observer.cc
index 79e58b5f..94be7c1 100644
--- a/content/browser/devtools/network_service_devtools_observer.cc
+++ b/content/browser/devtools/network_service_devtools_observer.cc
@@ -218,7 +218,7 @@
   if (!rfhi)
     return;
 
-  // TODO(https://crbug.com/1268378): Remove this once enforcement is always
+  // TODO(crbug.com/40204695): Remove this once enforcement is always
   // enabled and warnings are no more.
   if (is_warning && initiator_origin.has_value()) {
     if (!initiator_origin->IsSameOriginWith(url)) {
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc
index 7f47041..5018945 100644
--- a/content/browser/devtools/protocol/browser_handler.cc
+++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -113,7 +113,7 @@
 // //content/browser/permissions:permission_service_impl
 // ::PermissionDescriptorToPermissionType, producing an error in
 // |error_message| as necessary.
-// TODO(crbug.com/989983): De-duplicate this logic.
+// TODO(crbug.com/40638575): De-duplicate this logic.
 Response PermissionDescriptorToPermissionType(
     std::unique_ptr<protocol::Browser::PermissionDescriptor> descriptor,
     PermissionType* permission_type) {
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc
index c1633bb..e6532ef2 100644
--- a/content/browser/devtools/protocol/network_handler.cc
+++ b/content/browser/devtools/protocol/network_handler.cc
@@ -446,7 +446,7 @@
     }
     cookie_partition_key = deserialized_partition_key.value();
   }
-  // TODO(crbug.com/1225444) Add Partitioned to DevTools cookie structures.
+  // TODO(crbug.com/40188414) Add Partitioned to DevTools cookie structures.
   std::unique_ptr<net::CanonicalCookie> cookie =
       net::CanonicalCookie::CreateSanitizedCookie(
           url, name, value, normalized_domain, path, base::Time(),
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc
index b68824c5..60eb3e2 100644
--- a/content/browser/devtools/protocol/page_handler.cc
+++ b/content/browser/devtools/protocol/page_handler.cc
@@ -1209,7 +1209,7 @@
         modified_web_prefs);
 
     {
-      // TODO(crbug.com/1141835): Remove the bug is fixed.
+      // TODO(crbug.com/40727379): Remove the bug is fixed.
       // Walkaround for the bug. Emulated `view_size` has to be set twice,
       // otherwise the scrollbar will be on the screenshot present.
       blink::DeviceEmulationParams tmp_params = modified_params;
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.cc b/content/browser/fenced_frame/fenced_frame_url_mapping.cc
index 967e172..60496ac 100644
--- a/content/browser/fenced_frame/fenced_frame_url_mapping.cc
+++ b/content/browser/fenced_frame/fenced_frame_url_mapping.cc
@@ -195,7 +195,7 @@
     std::vector<blink::AdDescriptor> ad_component_descriptors,
     scoped_refptr<FencedFrameReporter> fenced_frame_reporter) {
   // Move pending mapped urn::uuid to `urn_uuid_to_url_map_`.
-  // TODO(crbug.com/1422301): Remove the check for whether `urn_uuid` has been
+  // TODO(crbug.com/40896818): Remove the check for whether `urn_uuid` has been
   // mapped already once the crash is resolved.
   CHECK(!IsMapped(urn_uuid));
   auto pending_it = pending_urn_uuid_to_url_map_.find(urn_uuid);
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.h b/content/browser/fenced_frame/fenced_frame_url_mapping.h
index 8b9c9db3..3c74c06 100644
--- a/content/browser/fenced_frame/fenced_frame_url_mapping.h
+++ b/content/browser/fenced_frame/fenced_frame_url_mapping.h
@@ -176,7 +176,7 @@
   // replacements map. The true URLs for any component ads associated with this
   // URN will also have substrings substituted. This function will be removed
   // once all FLEDGE auctions switch to using fenced frames.
-  // TODO(crbug.com/1253118): Remove this function when we remove support for
+  // TODO(crbug.com/40199055): Remove this function when we remove support for
   // showing FLEDGE ads in iframes.
   void SubstituteMappedURL(
       const GURL& urn_uuid,
diff --git a/content/browser/file_system_access/features.cc b/content/browser/file_system_access/features.cc
index 1604e375..aac6076 100644
--- a/content/browser/file_system_access/features.cc
+++ b/content/browser/file_system_access/features.cc
@@ -25,7 +25,7 @@
              "FileSystemAccessDragAndDropCheckBlocklist",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// TODO(crbug.com/1421735): Remove this flag eventually.
+// TODO(crbug.com/40896420): Remove this flag eventually.
 // When enabled, GetFile() and GetEntries() on a directory handle performs
 // the blocklist check on child file handles.
 BASE_FEATURE(kFileSystemAccessDirectoryIterationBlocklistCheck,
diff --git a/content/browser/file_system_access/file_system_access_file_handle_impl.cc b/content/browser/file_system_access/file_system_access_file_handle_impl.cc
index da24e2ea..bee8210 100644
--- a/content/browser/file_system_access/file_system_access_file_handle_impl.cc
+++ b/content/browser/file_system_access/file_system_access_file_handle_impl.cc
@@ -515,7 +515,7 @@
   DCHECK_EQ(GetWritePermissionStatus(),
             blink::mojom::PermissionStatus::GRANTED);
 
-  // TODO(crbug.com/1241401): Expand this check to all backends.
+  // TODO(crbug.com/40194651): Expand this check to all backends.
   if (url().type() == storage::kFileSystemTypeLocal) {
     base::ThreadPool::PostTaskAndReplyWithResult(
         FROM_HERE, {base::MayBlock()},
@@ -648,7 +648,7 @@
     // existence check and when file contents are copied to the new file.
     // However, since we've acquired an exclusive lock to the swap file, this
     // is only possible if the file is created external to this API.
-    // TODO(https://crbug.com/1382215): Consider requiring a lock to create an
+    // TODO(crbug.com/40245515): Consider requiring a lock to create an
     // empty file, e.g. parent.getFileHandle(swapFileName, {create: true}).
     manager()->DoFileSystemOperation(
         FROM_HERE, &FileSystemOperationRunner::FileExists,
diff --git a/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc b/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc
index 856421a..8f4f14c 100644
--- a/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc
+++ b/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc
@@ -504,7 +504,7 @@
   // Note: we can test that the open succeeded, but because the FileSystemURL
   // is not exposed to the callback we rely on WPTs to ensure the bucket
   // locator was actually used.
-  // TODO(crbug.com/1322897): Ensure the bucket override is actually used.
+  // TODO(crbug.com/40224463): Ensure the bucket override is actually used.
   ASSERT_TRUE(root);
 }
 
diff --git a/content/browser/file_system_access/file_system_access_observer_browsertest.cc b/content/browser/file_system_access/file_system_access_observer_browsertest.cc
index e9d1e86..d28fcb7d3 100644
--- a/content/browser/file_system_access/file_system_access_observer_browsertest.cc
+++ b/content/browser/file_system_access/file_system_access_observer_browsertest.cc
@@ -480,7 +480,7 @@
   EXPECT_THAT(records.GetList(), testing::Not(testing::IsEmpty()));
 }
 
-/// TODO(crbug/1499075): Re-enable after fixing flakiness.
+/// TODO(crbug.com/40939929): Re-enable after fixing flakiness.
 IN_PROC_BROWSER_TEST_P(FileSystemAccessObserverBrowserTest,
                        ObserveDirectoryRecursively) {
   base::FilePath dir_path = CreateDirectoryToBePicked();
diff --git a/content/browser/gpu/browser_child_process_backgrounded_bridge_browsertest.mm b/content/browser/gpu/browser_child_process_backgrounded_bridge_browsertest.mm
index c38dd55..b1891df 100644
--- a/content/browser/gpu/browser_child_process_backgrounded_bridge_browsertest.mm
+++ b/content/browser/gpu/browser_child_process_backgrounded_bridge_browsertest.mm
@@ -117,7 +117,7 @@
             base::Process::Priority::kUserBlocking);
 }
 
-// TODO(crbug.com/1426160): Disabled because this test is flaky.
+// TODO(crbug.com/40899195): Disabled because this test is flaky.
 IN_PROC_BROWSER_TEST_F(BrowserChildProcessBackgroundedBridgeTest,
                        DISABLED_InitiallyBackgrounded) {
   // Set the browser process as backgrounded.
diff --git a/content/browser/gpu/gpu_background_kill_android_browsertest.cc b/content/browser/gpu/gpu_background_kill_android_browsertest.cc
index 5895bbc..2832cd6 100644
--- a/content/browser/gpu/gpu_background_kill_android_browsertest.cc
+++ b/content/browser/gpu/gpu_background_kill_android_browsertest.cc
@@ -45,7 +45,7 @@
   scoped_refptr<gpu::GpuChannelHost> gpu_channel_host_;
 };
 
-// TODO(crbug.com/1471932): Flaky.
+// TODO(crbug.com/40926381): Flaky.
 IN_PROC_BROWSER_TEST_F(GpuKillBackgroundTest, DISABLED_Simple) {
   ASSERT_FALSE(IsChannelEstablished());
 
diff --git a/content/browser/handwriting/handwriting_recognizer_impl_cros.cc b/content/browser/handwriting/handwriting_recognizer_impl_cros.cc
index 47cc6d0..6cbdcb3 100644
--- a/content/browser/handwriting/handwriting_recognizer_impl_cros.cc
+++ b/content/browser/handwriting/handwriting_recognizer_impl_cros.cc
@@ -65,7 +65,7 @@
 }
 
 // Returns whether the two language tags are semantically the same.
-// TODO(https://crbug.com/1166910): We may need a better language tag matching
+// TODO(crbug.com/40742391): We may need a better language tag matching
 // method (e.g. libicu's LocaleMatcher).
 bool LanguageTagsAreMatching(std::string_view a, std::string_view b) {
   // Per BCP 47, language tag comparisons are case-insensitive.
diff --git a/content/browser/indexed_db/indexed_db_context_impl.h b/content/browser/indexed_db/indexed_db_context_impl.h
index 12cd124..72bfdce 100644
--- a/content/browser/indexed_db/indexed_db_context_impl.h
+++ b/content/browser/indexed_db/indexed_db_context_impl.h
@@ -333,7 +333,7 @@
   // directory entry's metadata. See crbug.com/1489517 and
   // https://devblogs.microsoft.com/oldnewthing/20111226-00/?p=8813
   //
-  // TODO(crbug.com/1493696): use an abstract model for quota instead of real
+  // TODO(crbug.com/40285925): use an abstract model for quota instead of real
   // world bytes.
   std::map<storage::BucketLocator, int64_t> bucket_size_map_;
 
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
index 29c07d4..3af8bd79 100644
--- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc
+++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -390,7 +390,7 @@
   // Make the next request fail with `error` -- subsequent requests will succeed
   // again unless another FailNextUpdateRequestWithError() call is made.
   //
-  // TODO(crbug.com/1298593): Replace this with FailUpdateRequestWithError().
+  // TODO(crbug.com/40215596): Replace this with FailUpdateRequestWithError().
   void FailNextUpdateRequestWithError(net::Error error) {
     base::AutoLock auto_lock(lock_);
     update_next_error_ = error;
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc
index c2c039e..22021db7 100644
--- a/content/browser/interest_group/interest_group_browsertest.cc
+++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -20078,7 +20078,7 @@
   EXPECT_EQ(nullptr, RunAuctionAndWait(auction_config));
 }
 
-// TODO(crbug.com/1474303): Re-enable this test
+// TODO(crbug.com/40927353): Re-enable this test
 IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, AuctionNonceIsValid) {
   GURL test_url =
       embedded_https_test_server().GetURL("a.test", "/page_with_iframe.html");
diff --git a/content/browser/interest_group/interest_group_permissions_checker.h b/content/browser/interest_group/interest_group_permissions_checker.h
index 246b881..f69f4424 100644
--- a/content/browser/interest_group/interest_group_permissions_checker.h
+++ b/content/browser/interest_group/interest_group_permissions_checker.h
@@ -33,7 +33,7 @@
 // Groups permissions checks that can be handled by the same .well-known fetch,
 // to avoid redundant fetches.
 //
-// TODO(https://crbug.com/1315805):
+// TODO(crbug.com/40221941):
 // * Consider adding a per-NIK / per-page / per-frame LRU cache. Roundtrip to
 //   the HTTP cache are slow, and we'll likely want to limit the number of
 //   pending operations the renderer sends to the browser process at a time.
diff --git a/content/browser/interest_group/interest_group_priority_util.cc b/content/browser/interest_group/interest_group_priority_util.cc
index fd6af50..e0d4489 100644
--- a/content/browser/interest_group/interest_group_priority_util.cc
+++ b/content/browser/interest_group/interest_group_priority_util.cc
@@ -37,7 +37,7 @@
   age = std::max(age, base::TimeDelta());
   age = std::min(age, base::Days(30));
 
-  // TODO(https://crbug.com/1343389): Add browserSignals.age.
+  // TODO(crbug.com/40231372): Add browserSignals.age.
   base::flat_map<std::string, double> browser_signals{
       {"browserSignals.one", 1},
       {"browserSignals.basePriority", interest_group.priority},
diff --git a/content/browser/interest_group/subresource_url_authorizations.cc b/content/browser/interest_group/subresource_url_authorizations.cc
index dbb7fca..db00fc5 100644
--- a/content/browser/interest_group/subresource_url_authorizations.cc
+++ b/content/browser/interest_group/subresource_url_authorizations.cc
@@ -47,7 +47,7 @@
     // subresources, allow sites to alter their <script> tags after calling
     // runAdAuction().
     //
-    // TODO(crbug.com/1320908): If the tokens match, but the bundle URLs don't,
+    // TODO(crbug.com/40223695): If the tokens match, but the bundle URLs don't,
     // report a bad mojo message from the renderer.
     ++it->second.count;
 
diff --git a/content/browser/loader/keep_alive_url_browsertest.cc b/content/browser/loader/keep_alive_url_browsertest.cc
index 2a318659..c75ece0 100644
--- a/content/browser/loader/keep_alive_url_browsertest.cc
+++ b/content/browser/loader/keep_alive_url_browsertest.cc
@@ -1348,7 +1348,7 @@
       return info.param;
     });
 
-// TODO(crbug.com/1482176): Re-enable this test on Mac.
+// TODO(crbug.com/40931297): Re-enable this test on Mac.
 #if BUILDFLAG(IS_MAC)
 #define MAYBE_MultipleRedirectsRequestWithIframeRemoval \
   DISABLED_MultipleRedirectsRequestWithIframeRemoval
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index 69fcf452..b245f69 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -498,7 +498,7 @@
   // interception is required, but these loaders are not; see crbug.com/1253314
   // and crbug.com/1253984.)
   //
-  // TODO(crbug.com/1255181): Consider getting rid of these exceptions.
+  // TODO(crbug.com/40794764): Consider getting rid of these exceptions.
   if (!request_info_->is_pdf) {
     // Requests to WebUI scheme won't get redirected to/from other schemes
     // or be intercepted, so we just let it go here.
diff --git a/content/browser/locks/lock_manager_browsertest.cc b/content/browser/locks/lock_manager_browsertest.cc
index 1ad17b0..8b33e37b 100644
--- a/content/browser/locks/lock_manager_browsertest.cc
+++ b/content/browser/locks/lock_manager_browsertest.cc
@@ -216,7 +216,7 @@
 
 // Verify that content::FeatureObserver is notified that a frame stopped holding
 // locks when it is navigated away.
-// TODO(crbug.com/1286329): Flakes on all platforms.
+// TODO(crbug.com/40815542): Flakes on all platforms.
 IN_PROC_BROWSER_TEST_F(LockManagerBrowserTest, DISABLED_ObserverNavigate) {
   if (!CheckShouldRunTestAndNavigate())
     return;
diff --git a/content/browser/media/cdm_registry_impl.cc b/content/browser/media/cdm_registry_impl.cc
index 8768d7e..6e31d04 100644
--- a/content/browser/media/cdm_registry_impl.cc
+++ b/content/browser/media/cdm_registry_impl.cc
@@ -590,8 +590,8 @@
 #if BUILDFLAG(IS_ANDROID)
   // Querying for the CDM version requires creating a MediaDrm object, so
   // delaying it until the capability is determined.
-  // TODO(crbug.com/1478367): Once querying capabilities on Android is done in a
-  // separate process, include the version with the capabilities returned.
+  // TODO(crbug.com/40280540): Once querying capabilities on Android is done in
+  // a separate process, include the version with the capabilities returned.
   itr->version = media::MediaDrmBridge::GetVersion(key_system);
 #endif
 }
diff --git a/content/browser/media/encrypted_media_browsertest.cc b/content/browser/media/encrypted_media_browsertest.cc
index 4bd80a3..f923be89 100644
--- a/content/browser/media/encrypted_media_browsertest.cc
+++ b/content/browser/media/encrypted_media_browsertest.cc
@@ -275,7 +275,7 @@
   TestSimplePlayback("bear-320x240-opus-av_enc-av.webm");
 }
 
-// TODO(crbug.com/1360765): Flaky on Android.
+// TODO(crbug.com/40863269): Flaky on Android.
 #if BUILDFLAG(IS_ANDROID)
 #define MAYBE_Playback_VideoClearAudio_WebM_Opus \
   DISABLED_Playback_VideoClearAudio_WebM_Opus
@@ -315,11 +315,11 @@
   TestSimplePlayback("bear-320x240-v_frag-vp9-cenc.mp4");
 }
 
-// TODO(crbug.com/707127): Decide when it's supported on Android.
+// TODO(crbug.com/40513452): Decide when it's supported on Android.
 #if !BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_MAC) || (BUILDFLAG(IS_FUCHSIA) && defined(ARCH_CPU_ARM_FAMILY))
-// TODO(https://crbug.com/1222685): Failing on Mac.
+// TODO(crbug.com/40187305): Failing on Mac.
 // TODO(https://crbug.com/1280308): Failing on Fuchsia arm.
 #define MAYBE_Playback_VideoOnly_WebM_VP9Profile2 \
   DISABLED_Playback_VideoOnly_WebM_VP9Profile2
@@ -357,7 +357,7 @@
   TestSimplePlayback("bear-av1-cenc.webm");
 }
 
-// TODO(crbug.com/1360665): Flaky on Android.
+// TODO(crbug.com/40863206): Flaky on Android.
 #if BUILDFLAG(IS_ANDROID)
 #define MAYBE_Playback_VideoOnly_WebM_AV1_10bit \
   DISABLED_Playback_VideoOnly_WebM_AV1_10bit
@@ -446,7 +446,7 @@
                       media::kErrorTitle);
 }
 
-// TODO(crbug.com/1360698): Flaky on Android.
+// TODO(crbug.com/40863223): Flaky on Android.
 #if BUILDFLAG(IS_ANDROID)
 #define MAYBE_Playback_Encryption_CENS DISABLED_Playback_Encryption_CENS
 #else
diff --git a/content/browser/media/media_license_quota_client.cc b/content/browser/media/media_license_quota_client.cc
index 0202426..251f263 100644
--- a/content/browser/media/media_license_quota_client.cc
+++ b/content/browser/media/media_license_quota_client.cc
@@ -22,7 +22,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // Media license data does not count against quota.
-  // TODO(crbug.com/1305441): Consider counting this data against quota.
+  // TODO(crbug.com/40218094): Consider counting this data against quota.
   std::move(callback).Run(0);
 }
 
diff --git a/content/browser/media/media_license_storage_host.cc b/content/browser/media/media_license_storage_host.cc
index bab2145..0c44b396 100644
--- a/content/browser/media/media_license_storage_host.cc
+++ b/content/browser/media/media_license_storage_host.cc
@@ -253,7 +253,7 @@
   }
 
   // Pass `delta`=0 since media license data does not count against quota.
-  // TODO(crbug.com/1305441): Consider counting this data against quota.
+  // TODO(crbug.com/40218094): Consider counting this data against quota.
   manager_->quota_manager_proxy()->NotifyBucketModified(
       storage::QuotaClientType::kMediaLicense, bucket_locator_, /*delta=*/0,
       /*modification_time=*/base::Time::Now(),
diff --git a/content/browser/navigation_transitions/back_forward_transition_animation_manager_android.cc b/content/browser/navigation_transitions/back_forward_transition_animation_manager_android.cc
index 4817206e..31fb12d 100644
--- a/content/browser/navigation_transitions/back_forward_transition_animation_manager_android.cc
+++ b/content/browser/navigation_transitions/back_forward_transition_animation_manager_android.cc
@@ -83,7 +83,7 @@
     // animation (impl's dtor will reset the layer's position and reclaim all
     // the resources).
     //
-    // TODO(https://crbug.com/1425943): We need a proper UX to support this.
+    // TODO(crbug.com/40261105): We need a proper UX to support this.
     animator_.reset();
   }
 
diff --git a/content/browser/navigation_transitions/back_forward_transition_animator.cc b/content/browser/navigation_transitions/back_forward_transition_animator.cc
index e0d7385..1b42d20 100644
--- a/content/browser/navigation_transitions/back_forward_transition_animator.cc
+++ b/content/browser/navigation_transitions/back_forward_transition_animator.cc
@@ -207,7 +207,7 @@
   // and 1.0 to 0.0 from right to left.
   CHECK_GE(gesture.progress(), 0.f);
   CHECK_LE(gesture.progress(), 1.f);
-  // TODO(https://crbug.com/1499915): Should check the number of KeyFrameModels
+  // TODO(crbug.com/40287990): Should check the number of KeyFrameModels
   // is 1 (for scrim).
 
   float progress_delta =
diff --git a/content/browser/navigation_transitions/back_forward_transition_animator.h b/content/browser/navigation_transitions/back_forward_transition_animator.h
index 6f46fef..6c691c3 100644
--- a/content/browser/navigation_transitions/back_forward_transition_animator.h
+++ b/content/browser/navigation_transitions/back_forward_transition_animator.h
@@ -150,7 +150,7 @@
     // responded, we will skip this state.
     kWaitingForBeforeUnloadResponse,
 
-    // TODO(https://crbug.com/1421082): If we were to bring the active page back
+    // TODO(crbug.com/40896070): If we were to bring the active page back
     // to let the user interact with the prompt (e.g., camera access), we need a
     // state for that.
 
diff --git a/content/browser/network/dns_https_protocol_upgrade_browsertest.cc b/content/browser/network/dns_https_protocol_upgrade_browsertest.cc
index 473fb6c..43164308 100644
--- a/content/browser/network/dns_https_protocol_upgrade_browsertest.cc
+++ b/content/browser/network/dns_https_protocol_upgrade_browsertest.cc
@@ -29,7 +29,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
-// TODO(https://crbug.com/1295770) Add tests that query a test Do53 server.
+// TODO(crbug.com/40214469) Add tests that query a test Do53 server.
 
 class DohHttpsProtocolUpgradeBrowserTest : public content::ContentBrowserTest {
  public:
diff --git a/content/browser/network/shared_dictionary_browsertest.cc b/content/browser/network/shared_dictionary_browsertest.cc
index f9931f19..7428f66 100644
--- a/content/browser/network/shared_dictionary_browsertest.cc
+++ b/content/browser/network/shared_dictionary_browsertest.cc
@@ -774,7 +774,7 @@
 
 // Tests end to end functionality of "compression dictionary transport" feature
 // with FeatureState of params.
-// TODO(crbug.com/1413922): Remove this when we fully launch this feature.
+// TODO(crbug.com/40255884): Remove this when we fully launch this feature.
 class SharedDictionaryFeatureStateBrowserTest
     : public SharedDictionaryBrowserTestBase,
       public ::testing::WithParamInterface<FeatureState> {
diff --git a/content/browser/network/split_cache_browsertest.cc b/content/browser/network/split_cache_browsertest.cc
index de2c42f..c2a6cfbd 100644
--- a/content/browser/network/split_cache_browsertest.cc
+++ b/content/browser/network/split_cache_browsertest.cc
@@ -477,7 +477,7 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
-// TODO(crbug.com/1486165): Times out on Mac.
+// TODO(crbug.com/40933594): Times out on Mac.
 #if BUILDFLAG(IS_MAC)
 #define MAYBE_SplitCache DISABLED_SplitCache
 #else
@@ -875,7 +875,7 @@
 // is_subframe_document_resource by checking that the size of the http cache
 // resources accessed after the resource is loaded from the blink cache is the
 // same as before that.
-// TODO(crbug.com/1166650): Test is flaky on Win.
+// TODO(crbug.com/40164302): Test is flaky on Win.
 #if BUILDFLAG(IS_WIN)
 #define MAYBE_NotifyExternalCacheHitCheckSubframeBit \
   DISABLED_NotifyExternalCacheHitCheckSubframeBit
diff --git a/content/browser/permissions/permission_controller_impl.cc b/content/browser/permissions/permission_controller_impl.cc
index ad18f61..bb32e796 100644
--- a/content/browser/permissions/permission_controller_impl.cc
+++ b/content/browser/permissions/permission_controller_impl.cc
@@ -695,7 +695,7 @@
     PermissionStatus status) {
   Subscription* subscription = subscriptions_.Lookup(subscription_id);
   DCHECK(subscription);
-  // TODO(crbug.com/1223407) Adding this block to prevent crashes while we
+  // TODO(crbug.com/40056329) Adding this block to prevent crashes while we
   // investigate the root cause of the crash. This block will be removed as the
   // CHECK() above should be enough.
   if (!subscription) {
diff --git a/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc b/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc
index c979e57..4f85cae 100644
--- a/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc
+++ b/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc
@@ -275,8 +275,8 @@
     std::move(on_window_created_notify_observers_callback_).Run();
   }
 
-  // TODO(crbug.com/1331248): Rather than set this synchronously, we should call
-  // back with the bounds once the window provides them.
+  // TODO(crbug.com/40227464): Rather than set this synchronously, we should
+  // call back with the bounds once the window provides them.
   *window_size = GetSize();
   return result;
 }
diff --git a/content/browser/preloading/prefetch/prefetch_canary_checker.cc b/content/browser/preloading/prefetch/prefetch_canary_checker.cc
index c56be95..9d39008 100644
--- a/content/browser/preloading/prefetch/prefetch_canary_checker.cc
+++ b/content/browser/preloading/prefetch/prefetch_canary_checker.cc
@@ -396,8 +396,8 @@
           base::BindOnce(&PrefetchCanaryChecker::OnDNSResolved, GetWeakPtr())),
       client_remote.InitWithNewPipeAndPassReceiver());
 
-  // TODO(crbug.com/1355169): Consider passing a SchemeHostPort to trigger HTTPS
-  // DNS resource record query.
+  // TODO(crbug.com/40235854): Consider passing a SchemeHostPort to trigger
+  // HTTPS DNS resource record query.
   browser_context_->GetDefaultStoragePartition()
       ->GetNetworkContext()
       ->ResolveHost(network::mojom::HostResolverHost::NewHostPortPair(
diff --git a/content/browser/preloading/prefetch/prefetch_origin_prober.cc b/content/browser/preloading/prefetch/prefetch_origin_prober.cc
index b97f44a8..3ef7d7c 100644
--- a/content/browser/preloading/prefetch/prefetch_origin_prober.cc
+++ b/content/browser/preloading/prefetch/prefetch_origin_prober.cc
@@ -239,8 +239,8 @@
           std::move(callback), also_do_tls_connect)),
       client_remote.InitWithNewPipeAndPassReceiver());
 
-  // TODO(crbug.com/1355169): Consider passing a SchemeHostPort to trigger HTTPS
-  // DNS resource record query.
+  // TODO(crbug.com/40235854): Consider passing a SchemeHostPort to trigger
+  // HTTPS DNS resource record query.
   browser_context_->GetDefaultStoragePartition()
       ->GetNetworkContext()
       ->ResolveHost(network::mojom::HostResolverHost::NewHostPortPair(
diff --git a/content/browser/quota/quota_change_browsertest.cc b/content/browser/quota/quota_change_browsertest.cc
index 9ca4d29b..574f8ee 100644
--- a/content/browser/quota/quota_change_browsertest.cc
+++ b/content/browser/quota/quota_change_browsertest.cc
@@ -62,7 +62,7 @@
   }
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
-    // TODO(crbug.com/1088004): Remove this when the QuotaChange
+    // TODO(crbug.com/40133191): Remove this when the QuotaChange
     // RuntimeEnabledFeature becomes "stable".
     command_line->AppendSwitch(
         switches::kEnableExperimentalWebPlatformFeatures);
@@ -107,7 +107,7 @@
 INSTANTIATE_TEST_SUITE_P(All, QuotaChangeBrowserTest, ::testing::Bool());
 
 IN_PROC_BROWSER_TEST_P(QuotaChangeBrowserTest, DispatchEvent) {
-  // TODO(crbug.com/1131242): Implement this test for incognito contexts after
+  // TODO(crbug.com/40721281): Implement this test for incognito contexts after
   // device information collection is unified into a single code path within
   // quota.
   if (is_incognito()) {
diff --git a/content/browser/reduce_accept_language/reduce_accept_language_utils.h b/content/browser/reduce_accept_language/reduce_accept_language_utils.h
index 45606a37..b9cea5f2 100644
--- a/content/browser/reduce_accept_language/reduce_accept_language_utils.h
+++ b/content/browser/reduce_accept_language/reduce_accept_language_utils.h
@@ -60,7 +60,7 @@
   // `request_origin` is the origin to be used for reduced accept language
   // storage.
   //
-  // TODO(crbug.com/1323776) confirm with CSP sandbox owner if language
+  // TODO(crbug.com/40224802) confirm with CSP sandbox owner if language
   // preferences need to be hidden from sandboxed origins.
   static bool OriginCanReduceAcceptLanguage(const url::Origin& request_origin);
 
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
index 10faf99..1ab2a3c 100644
--- a/content/browser/renderer_host/compositor_impl_android.cc
+++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -411,7 +411,7 @@
 
 void CompositorImpl::TearDownDisplayAndUnregisterRootFrameSink() {
   // Make a best effort to try to complete pending readbacks.
-  // TODO(crbug.com/637035): Consider doing this in a better way,
+  // TODO(crbug.com/40480324): Consider doing this in a better way,
   // ideally with the guarantee of readbacks completing.
   if (display_private_ && pending_readbacks_) {
     // Note that while this is not a Sync IPC, the call to
diff --git a/content/browser/renderer_host/early_swap_navigation_browsertest.cc b/content/browser/renderer_host/early_swap_navigation_browsertest.cc
index 9e1b44d..e13aa17 100644
--- a/content/browser/renderer_host/early_swap_navigation_browsertest.cc
+++ b/content/browser/renderer_host/early_swap_navigation_browsertest.cc
@@ -495,7 +495,7 @@
 // response, the early swap still happens.  Currently, this leaves an
 // about:blank page from the swapped-in RFH as the primary page.
 //
-// TODO(https://crbug.com/1480129): This case should be converted to show a new
+// TODO(crbug.com/40281212): This case should be converted to show a new
 // error page.
 IN_PROC_BROWSER_TEST_F(EarlySwapNavigationBrowserTest,
                        EarlySwapWith204Response) {
diff --git a/content/browser/renderer_host/input/event_latency_aura_browsertest.cc b/content/browser/renderer_host/input/event_latency_aura_browsertest.cc
index 0d36751..476f7deb 100644
--- a/content/browser/renderer_host/input/event_latency_aura_browsertest.cc
+++ b/content/browser/renderer_host/input/event_latency_aura_browsertest.cc
@@ -68,7 +68,7 @@
 
 // Tests that if a key-press on a page causes a visual update, appropriate event
 // latency metrics are reported.
-// TODO(crbug.com/1085046): flaky test.
+// TODO(crbug.com/40132021): flaky test.
 IN_PROC_BROWSER_TEST_F(EventLatencyBrowserTest, DISABLED_KeyPressOnButton) {
   base::HistogramTester histogram_tester;
 
@@ -342,10 +342,11 @@
 
   FetchHistogramsFromChildProcesses();
 
-  // TODO(crbug/1071645): Since this is this first key-press after the textbox
-  // is focused, there would be two reports, one for the RawKeyDown that causes
-  // some style changes (due to :focus-visible behavior) and one for the Char
-  // that inserts the actual character. These should be reported separately.
+  // TODO(crbug.com/40126863): Since this is this first key-press after the
+  // textbox is focused, there would be two reports, one for the RawKeyDown that
+  // causes some style changes (due to :focus-visible behavior) and one for the
+  // Char that inserts the actual character. These should be reported
+  // separately.
   base::HistogramTester::CountsMap expected_counts = {
       {"EventLatency.KeyPressed.BrowserToRendererCompositor", 2},
       {"EventLatency.KeyPressed.BeginImplFrameToSendBeginMainFrame", 2},
diff --git a/content/browser/renderer_host/input/touch_action_browsertest.cc b/content/browser/renderer_host/input/touch_action_browsertest.cc
index 06f9179..b84776b 100644
--- a/content/browser/renderer_host/input/touch_action_browsertest.cc
+++ b/content/browser/renderer_host/input/touch_action_browsertest.cc
@@ -463,7 +463,7 @@
     // It seems that even if the compositor frame has scrolled half of the
     // expected scroll offset, the Blink side scroll offset may not yet be
     // updated, so here we expect it to at least have scrolled.
-    // TODO(crbug.com/902446): this can be resolved by fixing this bug.
+    // TODO(crbug.com/40601223): this can be resolved by fixing this bug.
     if (expected_scroll_position_after_scroll.y() > 0)
       EXPECT_GT(scroll_top, 0);
     if (expected_scroll_position_after_scroll.x() > 0)
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
index 8f60a7f..c0452c3 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
@@ -1359,7 +1359,7 @@
   EXPECT_EQ(media_stream_manager_->num_dispatcher_hosts(), 0u);
 }
 
-// TODO(crbug.com/1300883): Add test cases for multi stream generation.
+// TODO(crbug.com/40216442): Add test cases for multi stream generation.
 
 class MediaStreamDispatcherHostStreamTypeCombinationTest
     : public MediaStreamDispatcherHostTest,
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index 2693d680..317c118 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -3049,7 +3049,7 @@
   }
 #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
 
-  // TODO(crbug.com/1300883): Generalize to multiple streams.
+  // TODO(crbug.com/40216442): Generalize to multiple streams.
   DCHECK_EQ(1u, request->stream_devices_set.stream_devices.size());
 
   // It is safe to bind base::Unretained(this) because MediaStreamManager is
diff --git a/content/browser/renderer_host/media/media_stream_manager_unittest.cc b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
index de493eb..0e11a72 100644
--- a/content/browser/renderer_host/media/media_stream_manager_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
@@ -633,7 +633,7 @@
       const std::string& label,
       blink::mojom::StreamDevicesSetPtr stream_devices_set,
       bool pan_tilt_zoom_allowed) {
-    // TODO(crbug.com/1300883): Generalize to multiple streams.
+    // TODO(crbug.com/40216442): Generalize to multiple streams.
     DCHECK_EQ(stream_devices_set->stream_devices.size(), 1u);
     if (request_audio && audio_share) {
       ASSERT_TRUE(
diff --git a/content/browser/renderer_host/navigation_controller_impl.h b/content/browser/renderer_host/navigation_controller_impl.h
index c461389..ad3ade6 100644
--- a/content/browser/renderer_host/navigation_controller_impl.h
+++ b/content/browser/renderer_host/navigation_controller_impl.h
@@ -472,7 +472,7 @@
   // Explainer:
   // https://github.com/jeremyroman/alternate-loading-modes/blob/main/browsing-context.md#session-history)
   //
-  // TODO(crbug.com/914108): Consider portals here as well.
+  // TODO(crbug.com/40606075): Consider portals here as well.
   bool ShouldMaintainTrivialSessionHistory(
       const FrameTreeNode* frame_tree_node) const;
 
diff --git a/content/browser/renderer_host/navigation_transitions/navigation_entry_screenshot_cache.cc b/content/browser/renderer_host/navigation_transitions/navigation_entry_screenshot_cache.cc
index 27b9ded1..22bd2cb1 100644
--- a/content/browser/renderer_host/navigation_transitions/navigation_entry_screenshot_cache.cc
+++ b/content/browser/renderer_host/navigation_transitions/navigation_entry_screenshot_cache.cc
@@ -124,7 +124,7 @@
   // is not true for Android where native OS gesture navigation only takes the
   // user back (even right-edge swipe).
   //
-  // TODO(crbug.com/1415332): Iterate on the eviction strategy based on metrics
+  // TODO(crbug.com/40256524): Iterate on the eviction strategy based on metrics
   // when this launches.
   //
   // Ex: [3, 4&, 5*, 6&, 7, 8&], where "*" means the last committed entry and
diff --git a/content/browser/renderer_host/navigation_transitions/navigation_entry_screenshot_manager.cc b/content/browser/renderer_host/navigation_transitions/navigation_entry_screenshot_manager.cc
index 605ede4..3c49c9ee 100644
--- a/content/browser/renderer_host/navigation_transitions/navigation_entry_screenshot_manager.cc
+++ b/content/browser/renderer_host/navigation_transitions/navigation_entry_screenshot_manager.cc
@@ -127,7 +127,7 @@
 // regardless of which tab the entry is from. The pro of this alternative is to
 // have all the eviction logic inside the global manager.
 //
-// TODO(https://crbug.com/1420998): We need some metrics to understand if the
+// TODO(crbug.com/40259040): We need some metrics to understand if the
 // currently implementation affects the cache hit rate. (I.e., would the
 // alternative be a better approach?)
 void NavigationEntryScreenshotManager::EvictIfOutOfMemoryBudget() {
diff --git a/content/browser/renderer_host/navigation_transitions/navigation_transition_utils.cc b/content/browser/renderer_host/navigation_transitions/navigation_transition_utils.cc
index d1649a5e..a9e49be 100644
--- a/content/browser/renderer_host/navigation_transitions/navigation_transition_utils.cc
+++ b/content/browser/renderer_host/navigation_transitions/navigation_transition_utils.cc
@@ -79,7 +79,7 @@
   }
 
   if (entry == controller->GetLastCommittedEntry()) {
-    // TODO(https://crbug.com/1472395): We shouldn't cache the screenshot into
+    // TODO(crbug.com/40278616): We shouldn't cache the screenshot into
     // the navigation entry if the entry is re-navigated after we send out the
     // copy request. See the two cases below.
     //
@@ -158,7 +158,7 @@
 // TODO(liuwilliam): remove it once all the TODOs are implemented.
 ShouldCapture ShouldCaptureForWorkInProgressConditions(
     const NavigationRequest& navigation_request) {
-  // TODO(https://crbug.com/1420995): Support same-doc navigations. Make sure
+  // TODO(crbug.com/40259037): Support same-doc navigations. Make sure
   // to test the `history.pushState` and `history.replaceState` APIs.
   if (navigation_request.IsSameDocument()) {
     return ShouldCapture::kNo;
@@ -192,7 +192,7 @@
     return ShouldCapture::kOnlyAskEmbedder;
   }
 
-  // TODO(https://crbug.com/1474904): Test capturing for WebUI.
+  // TODO(crbug.com/40279439): Test capturing for WebUI.
 
   return ShouldCapture::kYes;
 }
diff --git a/content/browser/renderer_host/origin_trial_state_host_impl.cc b/content/browser/renderer_host/origin_trial_state_host_impl.cc
index 8330e17..8196125 100644
--- a/content/browser/renderer_host/origin_trial_state_host_impl.cc
+++ b/content/browser/renderer_host/origin_trial_state_host_impl.cc
@@ -36,7 +36,7 @@
     base::flat_map<::blink::mojom::RuntimeFeature,
                    ::blink::mojom::OriginTrialFeatureStatePtr>
         origin_trial_features) {
-  // TODO(crbug.com/1377000): RuntimeFeatureState does not yet support
+  // TODO(crbug.com/40243430): RuntimeFeatureState does not yet support
   // HTTP header origin trial tokens, which currently cause this function to be
   // called between RenderFrameHostImpl::CommitNavigation() and
   // RenderFrameHostImpl::DidCommitNavigation(). As a result, we will reject all
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 4edf18d..109d53c 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -8473,7 +8473,7 @@
   if (IsCredentialless() || IsNestedWithinFencedFrame() ||
       CoopSuppressOpener(/*opener=*/this)) {
     params->opener_suppressed = true;
-    // TODO(https://crbug.com/1060691) This should be applied to all
+    // TODO(crbug.com/40679181) This should be applied to all
     // popups opened with noopener.
     params->frame_name.clear();
   }
@@ -9723,7 +9723,7 @@
   } else {
     // If the page is in back/forward cache, do not return early and continue to
     // apply AX tree updates.
-    // TODO(https://crbug.com/1328126): Define and implement the behavior for
+    // TODO(crbug.com/40841648): Define and implement the behavior for
     // when the page is prerendering, too.
     if (!IsInBackForwardCache() &&
         IsInactiveAndDisallowActivation(DisallowActivationReasonId::kAXEvent)) {
@@ -11115,8 +11115,8 @@
                              std::move(subresource_loader_factories),
                              document_token, std::move(policy_container));
 
-  // TODO(crbug/1129537): support UKM source creation for failed navigations
-  // too.
+  // TODO(crbug.com/40149432): support UKM source creation for failed
+  // navigations too.
 
   has_committed_any_navigation_ = true;
   DCHECK(navigation_request && navigation_request->IsNavigationStarted() &&
@@ -11411,7 +11411,7 @@
 void RenderFrameHostImpl::RequestAXTreeSnapshot(
     AXTreeSnapshotCallback callback,
     mojom::SnapshotAccessibilityTreeParamsPtr params) {
-  // TODO(https://crbug.com/859110): Remove once frame_ can no longer be null.
+  // TODO(crbug.com/40583141): Remove once frame_ can no longer be null.
   if (!IsRenderFrameLive())
     return;
 
diff --git a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
index fda9af4..39ad228 100644
--- a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
@@ -5209,7 +5209,7 @@
   EXPECT_THAT(EvalJs(web_contents(), kScript), EvalJsResult::IsError());
 }
 
-// TODO(crbug.com/1357783): This test is flaky.
+// TODO(crbug.com/40236762): This test is flaky.
 IN_PROC_BROWSER_TEST_F(RenderFrameHostImplBrowserTest,
                        DISABLED_RemoteObjectInvokeMethodReturningNumber) {
   GURL url(embedded_test_server()->GetURL("/empty.html"));
@@ -5221,7 +5221,7 @@
   EXPECT_EQ(kMainObject.id, EvalJs(web_contents(), kScript));
 }
 
-// TODO(crbug.com/1358215): This test is flaky.
+// TODO(crbug.com/40236899): This test is flaky.
 IN_PROC_BROWSER_TEST_F(RenderFrameHostImplBrowserTest,
                        DISABLED_RemoteObjectInvokeMethodTakingArray) {
   GURL url(embedded_test_server()->GetURL("/empty.html"));
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index ac90de4..112e771 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -976,7 +976,7 @@
     return std::numeric_limits<size_t>::max();
   return base::saturated_cast<size_t>(limit.rlim_cur);
 #else
-  // TODO(https://crbug.com/104689): Implement on other platforms.
+  // TODO(crbug.com/40671068): Implement on other platforms.
   return kUnknownPlatformProcessLimit;
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 }
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index df8b31a..a23ab26 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -1024,7 +1024,7 @@
   // still be early histograms recorded before the child reads its launch
   // parameters to learn of the shared memory region.
   //
-  // TODO(crbug/1028263): It may be possible to completely remove this once
+  // TODO(crbug.com/40109064): It may be possible to completely remove this once
   // passing the memory region on launch is rolled-out, if the shmem parameter
   // is consumed before the child records any histograms.
   void ShareMetricsMemoryRegion();
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 6902bb7..0df25f1 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -2702,7 +2702,7 @@
 #if BUILDFLAG(IS_WIN)
   // Scale the offset by device scale factor, otherwise the drag
   // image location doesn't line up with the drop location (drag destination).
-  // TODO(crbug.com/1354831): this conversion should not be necessary.
+  // TODO(crbug.com/40859305): this conversion should not be necessary.
   gfx::Vector2dF scaled_offset = static_cast<gfx::Vector2dF>(offset);
   scaled_offset.Scale(scale);
   offset = gfx::ToRoundedVector2d(scaled_offset);
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 7b2edbca..f4c53df 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -400,7 +400,7 @@
     pending_screen_state_.any_non_rotation_size_changed = true;
   }
 
-  // TODO(crbug.com/1375258): We need a pre-Android S detection of
+  // TODO(crbug.com/40242839): We need a pre-Android S detection of
   // Picture-in-Picture mode. The `visible_viewport_size` and
   // `physical_backing_size` will be shrunk, though it is not guaranteed to be
   // simply a scale from the fullscreen size. As sometimes inset changes are
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
index a0faa07a..d829f37 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -4230,7 +4230,7 @@
 
 // Tests that the gesture debounce timer plays nice with the overscroll
 // controller.
-// TODO(crbug.com/776424): Disabled due to flakiness on Linux tsan.
+// TODO(crbug.com/40545668): Disabled due to flakiness on Linux tsan.
 #if BUILDFLAG(USING_SANITIZER)
 #define MAYBE_GestureScrollDebounceTimerOverscroll \
   DISABLED_GestureScrollDebounceTimerOverscroll
diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc
index b1fd8fe..d3d2495 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.cc
+++ b/content/browser/renderer_host/render_widget_host_view_base.cc
@@ -736,7 +736,7 @@
 void RenderWidgetHostViewBase::ProcessMouseEvent(
     const blink::WebMouseEvent& event,
     const ui::LatencyInfo& latency) {
-  // TODO(crbug.com/814674): Figure out the reason |host| is null here in all
+  // TODO(crbug.com/40564125): Figure out the reason |host| is null here in all
   // Process* functions.
   if (!host())
     return;
diff --git a/content/browser/resource_loading_browsertest.cc b/content/browser/resource_loading_browsertest.cc
index 9373062..d4e8a88 100644
--- a/content/browser/resource_loading_browsertest.cc
+++ b/content/browser/resource_loading_browsertest.cc
@@ -19,7 +19,7 @@
 const char kResourceLoadingNonMobilePage[] =
     "/resource_loading/resource_loading_non_mobile.html";
 
-// TODO(https://crbug.com/1340721): Flaky on Android.
+// TODO(crbug.com/40850567): Flaky on Android.
 #if BUILDFLAG(IS_ANDROID)
 #define MAYBE_ResourceLoadingAvoidDoubleDownloads \
   DISABLED_ResourceLoadingAvoidDoubleDownloads
diff --git a/content/browser/security/coop/cross_origin_opener_policy_browsertest.cc b/content/browser/security/coop/cross_origin_opener_policy_browsertest.cc
index 6ddbc07..b9ea012 100644
--- a/content/browser/security/coop/cross_origin_opener_policy_browsertest.cc
+++ b/content/browser/security/coop/cross_origin_opener_policy_browsertest.cc
@@ -1283,7 +1283,7 @@
 
   // COOP and COEP inherited from Blob creator (initial window) and not the
   // initiator (first popup)
-  // TODO(https://crbug.com/1059300) COOP should be inherited from creator and
+  // TODO(crbug.com/40051710) COOP should be inherited from creator and
   // be same-origin-allow-popups, instead of inheriting from initiator.
   EXPECT_EQ(
       second_popup_rfh->cross_origin_opener_policy(),
@@ -5016,7 +5016,7 @@
 
   EXPECT_EQ(false, EvalJs(sub_document, "'SharedArrayBuffer' in globalThis"));
 
-  // TODO(https://crbug.com/1144838): Being able to share SharedArrayBuffer from
+  // TODO(crbug.com/40155614): Being able to share SharedArrayBuffer from
   // a document with self.crossOriginIsolated == false sounds wrong.
   EXPECT_TRUE(ExecJs(sub_document, R"(
     // Create a WebAssembly Memory to bypass the SAB constructor restriction.
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index 1a52bc29..4cfba1c 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -1283,7 +1283,7 @@
 // Update the service worker by registering a worker with different script url.
 // This test makes sure the worker can handle the fetch event using CacheStorage
 // API.
-// TODO(crbug.com/1087869): flaky on all platforms.
+// TODO(crbug.com/40695132): flaky on all platforms.
 IN_PROC_BROWSER_TEST_F(ServiceWorkerEagerCacheStorageSetupTest,
                        DISABLED_UpdateOnScriptUrlChange) {
   StartServerAndNavigateToSetup();
diff --git a/content/browser/service_worker/service_worker_registry.h b/content/browser/service_worker/service_worker_registry.h
index 9bfc2e58..5ed0813 100644
--- a/content/browser/service_worker/service_worker_registry.h
+++ b/content/browser/service_worker/service_worker_registry.h
@@ -525,7 +525,7 @@
 
   bool is_storage_disabled_ = false;
 
-  // TODO(crbug.com/1016065): Consider moving QuotaManagerProxy to
+  // TODO(crbug.com/40103974): Consider moving QuotaManagerProxy to
   // ServiceWorkerStorage once QuotaManager gets mojofied.
   const scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_;
   const scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy_;
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h
index 537bcda..9167000 100644
--- a/content/browser/service_worker/service_worker_version.h
+++ b/content/browser/service_worker/service_worker_version.h
@@ -1158,7 +1158,7 @@
   // |controllee_map_| and |bfcached_controllee_map_| should not share the same
   // controllee.  ServiceWorkerContainerHost in the controllee maps should be
   // non-null.
-  // TODO(crbug.com/1253581): Fix cases where hosts can become nullptr while
+  // TODO(crbug.com/40199210): Fix cases where hosts can become nullptr while
   //                          stored in the maps.
   std::map<std::string, base::WeakPtr<ServiceWorkerContainerHost>>
       controllee_map_;
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 3bc42c4..69769f36 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -5071,7 +5071,7 @@
   // The blocked url reported in the console message should only contain the
   // origin, in order to avoid sensitive data being leaked to the parent frame.
   //
-  // TODO(https://crbug.com/1146651): We should not leak any information at all
+  // TODO(crbug.com/40053800): We should not leak any information at all
   // to the parent frame. Instead, we should send a message directly to Devtools
   // (without passing through a renderer): that can also contain more
   // information (like the full blocked url).
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc
index fab602e..d20021b 100644
--- a/content/browser/site_per_process_hit_test_browsertest.cc
+++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -6260,7 +6260,7 @@
 // Tests that a <select>'s visibility is correctly computed and thus shows the
 // popup when clicked.
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_CASTOS)
-// TODO(crbug.com/1405317): Test is flaky on every platform.
+// TODO(crbug.com/40252258): Test is flaky on every platform.
 IN_PROC_BROWSER_TEST_F(SitePerProcessHitTestBrowserTest,
                        DISABLED_ScrolledMainFrameSelectInLongIframe) {
   GURL main_url(embedded_test_server()->GetURL(
diff --git a/content/browser/snapshot_browsertest.cc b/content/browser/snapshot_browsertest.cc
index 00768c5..55a7ab7 100644
--- a/content/browser/snapshot_browsertest.cc
+++ b/content/browser/snapshot_browsertest.cc
@@ -215,7 +215,7 @@
 #if !BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_MAC)
-// TODO(crbug.com/1347296): This test is flakey on macOS.
+// TODO(crbug.com/40854618): This test is flakey on macOS.
 #define MAYBE_SingleWindowTest DISABLED_SingleWindowTest
 #else
 #define MAYBE_SingleWindowTest SingleWindowTest
@@ -322,7 +322,7 @@
 //   Linux Chromium OS ASAN LSAN Tests (1)
 //   Linux TSAN Tests
 // See crbug.com/771119
-// TODO(crbug.com/1164581): recently crashes flakily on
+// TODO(crbug.com/40740836): recently crashes flakily on
 // linux_chromium_asan_rel_ng and linux-rel.
 // TODO(https://crbug.com/1317446): Fix and enable on Fuchsia.
 #if (BUILDFLAG(IS_WIN) && !defined(NDEBUG)) || BUILDFLAG(IS_CHROMEOS_ASH) || \
diff --git a/content/browser/speech/tts_mac.mm b/content/browser/speech/tts_mac.mm
index dbd4846..77e2e8f 100644
--- a/content/browser/speech/tts_mac.mm
+++ b/content/browser/speech/tts_mac.mm
@@ -185,7 +185,7 @@
     const content::VoiceData& voice,
     const content::UtteranceContinuousParameters& params,
     base::OnceCallback<void(bool)> on_speak_finished) {
-  // Parse SSML and process speech. TODO(https://crbug.com/1457381):
+  // Parse SSML and process speech. TODO(crbug.com/40273591):
   // AVSpeechUtterance has an initializer -initWithSSMLRepresentation:. Should
   // that be used instead?
   content::TtsController::GetInstance()->StripSSML(
diff --git a/content/browser/storage_partition_impl.h b/content/browser/storage_partition_impl.h
index 98fb5d4..e66a6b9d 100644
--- a/content/browser/storage_partition_impl.h
+++ b/content/browser/storage_partition_impl.h
@@ -183,7 +183,7 @@
   DOMStorageContextWrapper* GetDOMStorageContext() override;
   storage::mojom::LocalStorageControl* GetLocalStorageControl() override;
   LockManager* GetLockManager();  // override; TODO: Add to interface
-  // TODO(https://crbug.com/1218540): Add this method to the StoragePartition
+  // TODO(crbug.com/40185706): Add this method to the StoragePartition
   // interface, which would also require making SharedStorageWorkletHostManager
   // an interface accessible in //content/public/.
   SharedStorageWorkletHostManager*
diff --git a/content/browser/web_contents/web_contents_view.h b/content/browser/web_contents/web_contents_view.h
index 285dc389..0cc1db9 100644
--- a/content/browser/web_contents/web_contents_view.h
+++ b/content/browser/web_contents/web_contents_view.h
@@ -70,7 +70,7 @@
 
   // Used to transfer WebContentsViewDragSecurityInfo across portal activation
   // (where we destroy and create a new WebContentsView for a tab).
-  // TODO(crbug.com/1254770): We don't need this after we migrate portals to
+  // TODO(crbug.com/40199730): We don't need this after we migrate portals to
   // MPArch.
   virtual void TransferDragSecurityInfo(WebContentsView* view) = 0;
 
diff --git a/content/browser/web_contents/web_contents_view_aura_browsertest.cc b/content/browser/web_contents/web_contents_view_aura_browsertest.cc
index 222cf80..7713ec68 100644
--- a/content/browser/web_contents/web_contents_view_aura_browsertest.cc
+++ b/content/browser/web_contents/web_contents_view_aura_browsertest.cc
@@ -508,7 +508,7 @@
   // this test to fail. This observer will let us know if this is happening.
   SpuriousMouseMoveEventObserver mouse_observer(GetRenderWidgetHost());
 
-  // TODO(crbug.com/1322921): Use a mock timer to generate timestamps for
+  // TODO(crbug.com/40838320): Use a mock timer to generate timestamps for
   // events. This would need injecting the mock timer into
   // `cc::CompositorFrameReportingController`.
   ui::TouchEvent press(
diff --git a/content/browser/webid/fake_identity_request_dialog_controller.cc b/content/browser/webid/fake_identity_request_dialog_controller.cc
index 781d845..a8a0ae87 100644
--- a/content/browser/webid/fake_identity_request_dialog_controller.cc
+++ b/content/browser/webid/fake_identity_request_dialog_controller.cc
@@ -30,7 +30,7 @@
     LoginToIdPCallback on_add_account,
     DismissCallback dismiss_callback,
     AccountsDisplayedCallback accounts_displayed_callback) {
-  // TODO(crbug.com/1348262): Temporarily support only the first IDP, extend to
+  // TODO(crbug.com/40233285): Temporarily support only the first IDP, extend to
   // support multiple IDPs.
   std::vector<IdentityRequestAccount> accounts =
       identity_provider_data[0].accounts;
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc
index 6ede614..d691060 100644
--- a/content/browser/webid/federated_auth_request_impl.cc
+++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -1050,7 +1050,7 @@
 
 void FederatedAuthRequestImpl::CancelTokenRequest() {
   if (!auth_request_token_callback_) {
-    // TODO(crbug.com/1500499): this should only happen with a compromised
+    // TODO(crbug.com/40940748): this should only happen with a compromised
     // renderer process but for some reason that is not the case. We should
     // investigate what could go wrong about the abort controller.
     return;
@@ -1519,7 +1519,7 @@
     return state1 < state2;
   });
 
-  // TODO(crbug.com/1383384): Handle auto_reauthn_ for multi IDP.
+  // TODO(crbug.com/40246099): Handle auto_reauthn_ for multi IDP.
   bool auto_reauthn_enabled =
       mediation_requirement_ != MediationRequirement::kRequired;
 
@@ -1682,7 +1682,7 @@
       base::BindOnce(&FederatedAuthRequestImpl::CompleteRequestWithError,
                      weak_ptr_factory_.GetWeakPtr()));
 
-  // TODO(crbug.com/1382863): Handle UI where some IDPs are successful and some
+  // TODO(crbug.com/40245853): Handle UI where some IDPs are successful and some
   // IDPs are failing in the multi IDP case.
   // Note that ShowAccountsDialog() may result in the request being completed
   // immediately (for instance on Android when we cannot create a BottomSheet),
diff --git a/content/browser/webid/federated_auth_request_impl.h b/content/browser/webid/federated_auth_request_impl.h
index 3bfdabb..eaa5917 100644
--- a/content/browser/webid/federated_auth_request_impl.h
+++ b/content/browser/webid/federated_auth_request_impl.h
@@ -482,8 +482,8 @@
   // Pending disconnect request.
   std::unique_ptr<FederatedAuthDisconnectRequest> disconnect_request_;
 
-  // TODO(crbug.com/1361649): Refactor these member variables introduced through
-  // the multi IDP prototype implementation to make them less confusing.
+  // TODO(crbug.com/40238075): Refactor these member variables introduced
+  // through the multi IDP prototype implementation to make them less confusing.
 
   // Parameters passed to RequestToken().
   base::flat_map<GURL, IdentityProviderGetInfo> token_request_get_infos_;
diff --git a/content/browser/webid/webid_browsertest.cc b/content/browser/webid/webid_browsertest.cc
index af846daf..272c9ae1 100644
--- a/content/browser/webid/webid_browsertest.cc
+++ b/content/browser/webid/webid_browsertest.cc
@@ -78,7 +78,7 @@
 constexpr char kTestContentType[] = "application/json";
 constexpr char kIdpForbiddenHeader[] = "Sec-FedCM-CSRF";
 
-// TODO(crbug.com/1381501): Replace these with a standardized header once
+// TODO(crbug.com/40245246): Replace these with a standardized header once
 // we collected enough metrics.
 static constexpr char kSetLoginHeader[] = "Set-Login";
 static constexpr char kLoggedInHeaderValue[] = "logged-in";
diff --git a/content/browser/webrtc/webrtc_image_capture_browsertest.cc b/content/browser/webrtc/webrtc_image_capture_browsertest.cc
index b059774..3423463b 100644
--- a/content/browser/webrtc/webrtc_image_capture_browsertest.cc
+++ b/content/browser/webrtc/webrtc_image_capture_browsertest.cc
@@ -20,7 +20,7 @@
 namespace content {
 
 // Disable FocusDistance test which fails with Logitech cameras.
-// TODO(crbug.com/957020): renable these tests when we have a way to detect
+// TODO(crbug.com/40624855): renable these tests when we have a way to detect
 // which device is connected and hence avoid running it if the camera is
 // Logitech.
 #define MAYBE_ManipulateFocusDistance DISABLED_ManipulateFocusDistance
diff --git a/content/browser/worker_host/dedicated_worker_host.cc b/content/browser/worker_host/dedicated_worker_host.cc
index 8dd6fc6..12a9518 100644
--- a/content/browser/worker_host/dedicated_worker_host.cc
+++ b/content/browser/worker_host/dedicated_worker_host.cc
@@ -443,7 +443,7 @@
       storage_partition->GetWeakPtr(), final_response_url,
       coep.reporting_endpoint, coep.report_only_reporting_endpoint,
       reporting_source_, isolation_info_.network_anonymization_key());
-  // TODO(crbug.com/1197041): Bind the receiver of ReportingObserver to the
+  // TODO(crbug.com/40176729): Bind the receiver of ReportingObserver to the
   // worker in the renderer process.
 
   // > 14.8 If the result of checking a global object's embedder policy with
diff --git a/content/browser/worker_host/worker_script_fetcher.cc b/content/browser/worker_host/worker_script_fetcher.cc
index aa2df47..0dd3ec3 100644
--- a/content/browser/worker_host/worker_script_fetcher.cc
+++ b/content/browser/worker_host/worker_script_fetcher.cc
@@ -417,7 +417,7 @@
     }
 
     const url::Origin& request_initiator = *resource_request->request_initiator;
-    // TODO(https://crbug.com/1060837): Pass the Mojo remote which is connected
+    // TODO(crbug.com/40122194): Pass the Mojo remote which is connected
     // to the COEP reporter in DedicatedWorkerHost.
     network::mojom::URLLoaderFactoryParamsPtr factory_params =
         URLLoaderFactoryParamsHelper::CreateForWorker(
diff --git a/content/browser/xr/service/xr_runtime_manager_impl.cc b/content/browser/xr/service/xr_runtime_manager_impl.cc
index 4b12a2e..34aa7602 100644
--- a/content/browser/xr/service/xr_runtime_manager_impl.cc
+++ b/content/browser/xr/service/xr_runtime_manager_impl.cc
@@ -563,7 +563,7 @@
 
   for (const auto& provider : providers_) {
     if (!provider) {
-      // TODO(crbug.com/1050470): Remove this logging after investigation.
+      // TODO(crbug.com/40673158): Remove this logging after investigation.
       LOG(ERROR) << __func__ << " got null XR provider";
       continue;
     }
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
index 2f26eaf..fa9ad63 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
@@ -78,7 +78,7 @@
 
 DWriteFontCollectionProxy::~DWriteFontCollectionProxy() = default;
 
-// TODO(crbug.com/1256946): Confirm this is useful and remove it otherwise.
+// TODO(crbug.com/40200438): Confirm this is useful and remove it otherwise.
 void DWriteFontCollectionProxy::InitializePrewarmer() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
diff --git a/content/child/field_trial.cc b/content/child/field_trial.cc
index ddf758a..54845e3 100644
--- a/content/child/field_trial.cc
+++ b/content/child/field_trial.cc
@@ -37,12 +37,13 @@
   base::FieldTrialList::CreateTrialsInChildProcess(command_line);
   std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
   base::FieldTrialList::ApplyFeatureOverridesInChildProcess(feature_list.get());
-  // TODO(crbug.com/988603): This may be redundant. The way this is supposed to
-  // work is that the parent process's state should be passed via command-line
-  // to the child process, such that a feature explicitly enabled or disabled in
-  // the parent process via this mechanism (since the browser process also
-  // registers these switch-dependent overrides), it will get passed via the
-  // command line - so then no extra logic would be needed in the child.
+  // TODO(crbug.com/40638048): This may be redundant. The way this is supposed
+  // to work is that the parent process's state should be passed via
+  // command-line to the child process, such that a feature explicitly enabled
+  // or disabled in the parent process via this mechanism (since the browser
+  // process also registers these switch-dependent overrides), it will get
+  // passed via the command line - so then no extra logic would be needed in the
+  // child.
   // TODO(chlily): Test this more thoroughly and understand the behavior to see
   // whether this is actually needed.
   feature_list->RegisterExtraFeatureOverrides(
diff --git a/content/common/process_visibility_tracker.h b/content/common/process_visibility_tracker.h
index e21b292..c9d3acc9 100644
--- a/content/common/process_visibility_tracker.h
+++ b/content/common/process_visibility_tracker.h
@@ -20,7 +20,7 @@
 // This class represents overall on-screen visibility for a given process of the
 // embedding application. Currently only works/is used in the browser process on
 // Android (Chrome and WebView).
-// TODO(crbug.com/1177542): implement usage in other processes.
+// TODO(crbug.com/40168826): implement usage in other processes.
 // Observers can be added from any sequence, but OnProcessVisibilityChanged()
 // should be called from the thread that created the tracker instance.
 class CONTENT_EXPORT ProcessVisibilityTracker {
diff --git a/content/common/webid/identity_url_loader_throttle.cc b/content/common/webid/identity_url_loader_throttle.cc
index dc354842..05bb52b 100644
--- a/content/common/webid/identity_url_loader_throttle.cc
+++ b/content/common/webid/identity_url_loader_throttle.cc
@@ -91,7 +91,7 @@
   if (!network::IsOriginPotentiallyTrustworthy(origin))
     return;
 
-  // TODO(crbug.com/1357790):
+  // TODO(crbug.com/40236764):
   // - Limit to toplevel frames
   // - Decide whether to limit to same-origin
   // - Decide the right behavior with respect to user gestures.
diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc
index 322a2e3..ab52bde9 100644
--- a/content/gpu/gpu_main.cc
+++ b/content/gpu/gpu_main.cc
@@ -304,7 +304,7 @@
             base::MessagePumpType::NS_RUNLOOP);
     // As part of the migration to DoWork(), this policy is required to keep
     // previous behavior and avoid regressions.
-    // TODO(crbug.com/1041853): Consider updating the policy.
+    // TODO(crbug.com/40668161): Consider updating the policy.
     main_thread_task_executor->SetWorkBatchSize(2);
 #else
     main_thread_task_executor =
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index e8362c31..c8f3d23f 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -193,6 +193,7 @@
     "//third_party/blink/public/mojom:android_mojo_bindings_java",
     "//third_party/blink/public/mojom:mojom_core_java",
     "//third_party/blink/public/mojom:mojom_platform_java",
+    "//third_party/blink/public/mojom:web_feature_mojo_bindings_java",
     "//third_party/jni_zero:jni_zero_java",
     "//ui/accessibility:accessibility_features_java",
     "//ui/accessibility:accessibility_features_native_map_java",
@@ -359,6 +360,7 @@
     "java/src/org/chromium/content_public/browser/ContentFeatureList.java",
     "java/src/org/chromium/content_public/browser/ContentFeatureMap.java",
     "java/src/org/chromium/content_public/browser/ContentViewStatics.java",
+    "java/src/org/chromium/content_public/browser/ContentWebFeatureUsageUtils.java",
     "java/src/org/chromium/content_public/browser/GestureListenerManager.java",
     "java/src/org/chromium/content_public/browser/GestureStateListener.java",
     "java/src/org/chromium/content_public/browser/GlobalRenderFrameHostId.java",
@@ -520,6 +522,7 @@
     "java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java",
     "java/src/org/chromium/content/browser/webid/DigitalIdentityProvider.java",
     "java/src/org/chromium/content_public/browser/ContentFeatureMap.java",
+    "java/src/org/chromium/content_public/browser/ContentWebFeatureUsageUtils.java",
     "java/src/org/chromium/content_public/browser/LoadCommittedDetails.java",
     "java/src/org/chromium/content_public/browser/LoadUrlParams.java",
     "java/src/org/chromium/content_public/browser/NavigationHandle.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java b/content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java
index 21daafa..10d30881 100644
--- a/content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java
+++ b/content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java
@@ -108,7 +108,7 @@
                     "BackgroundSync.NetworkObserver.HasPermission", true);
         }
         mNativePtrs.add(nativePtr);
-        // TODO(crbug/1493005): remove this call if it is not necessary.
+        // TODO(crbug.com/40936429): remove this call if it is not necessary.
         mNotifier.updateCurrentNetworkState();
         BackgroundSyncNetworkObserverJni.get()
                 .notifyConnectionTypeChanged(
@@ -178,7 +178,7 @@
         // If we're in doze mode (N+ devices), onConnectionTypeChanged may not
         // be called, but this function should. So update the connection type
         // if necessary.
-        // TODO(crbug/1493005): remove this call if it is not necessary.
+        // TODO(crbug.com/40936429): remove this call if it is not necessary.
         mNotifier.updateCurrentNetworkState();
         broadcastNetworkChangeIfNecessary(mNotifier.getCurrentNetworkState().getConnectionType());
     }
diff --git a/content/public/android/java/src/org/chromium/content/browser/font/AndroidFontLookupImpl.java b/content/public/android/java/src/org/chromium/content/browser/font/AndroidFontLookupImpl.java
index 48edb1d5..e91c717 100644
--- a/content/public/android/java/src/org/chromium/content/browser/font/AndroidFontLookupImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/font/AndroidFontLookupImpl.java
@@ -112,10 +112,11 @@
      * "preloaded_fonts" AndroidManifest directive, and have not previously failed a programmatic
      * font fetch request.
      *
-     * TODO(crbug.com/1111148): Ensure the font preload by manifest XML is also done for WebView.
+     * <p>TODO(crbug.com/40142462): Ensure the font preload by manifest XML is also done for
+     * WebView.
      *
      * @param callback The callback to be called with the list of fonts expected (but not
-     *         guaranteed) to be available. The list is sorted in ascending order.
+     *     guaranteed) to be available. The list is sorted in ascending order.
      */
     @Override
     public void getUniqueNameLookupTable(GetUniqueNameLookupTable_Response callback) {
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/ContentWebFeatureUsageUtils.java b/content/public/android/java/src/org/chromium/content_public/browser/ContentWebFeatureUsageUtils.java
new file mode 100644
index 0000000..360658e
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content_public/browser/ContentWebFeatureUsageUtils.java
@@ -0,0 +1,25 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content_public.browser;
+
+import org.jni_zero.JNINamespace;
+import org.jni_zero.NativeMethods;
+
+import org.chromium.blink.mojom.WebFeature;
+
+/** A Java API for calling ContentBrowserClient::LogWebFeatureForCurrentPage(). */
+@JNINamespace("content")
+public class ContentWebFeatureUsageUtils {
+    public static void logWebFeatureForCurrentPage(
+            WebContents webContents, @WebFeature.EnumType int webFeature) {
+        ContentWebFeatureUsageUtilsJni.get().logWebFeatureForCurrentPage(webContents, webFeature);
+    }
+
+    @NativeMethods
+    public interface Natives {
+        void logWebFeatureForCurrentPage(
+                WebContents webContents, @WebFeature.EnumType int webFeature);
+    }
+}
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 634b9de..50b1e6e 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -874,7 +874,7 @@
       const std::vector<GlobalRenderFrameHostId>& render_frames);
 
   // Allow the embedder to control whether we can use Web Bluetooth.
-  // TODO(crbug.com/589228): Replace this with a use of the permission system.
+  // TODO(crbug.com/40458188): Replace this with a use of the permission system.
   enum class AllowWebBluetoothResult {
     ALLOW,
     BLOCK_POLICY,
diff --git a/content/public/browser/media_stream_request.h b/content/public/browser/media_stream_request.h
index c64a3b8..1998f7a 100644
--- a/content/public/browser/media_stream_request.h
+++ b/content/public/browser/media_stream_request.h
@@ -57,7 +57,7 @@
   // identifying this request. This is used for cancelling request.
   int page_request_id;
 
-  // TODO(crbug.com/1503955): Remove security_origin.
+  // TODO(crbug.com/40944449): Remove security_origin.
   // The WebKit security origin for the current request (e.g. "html5rocks.com").
   GURL security_origin;
 
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index a4faeb4..a207a84 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -696,7 +696,7 @@
 const char kSandboxIPCProcess[]             = "sandbox-ipc";
 
 // Enables shared array buffer on desktop, gated by an Enterprise Policy.
-// TODO(crbug.com/1144104) Remove when migration to COOP+COEP is complete.
+// TODO(crbug.com/40155376) Remove when migration to COOP+COEP is complete.
 #if !BUILDFLAG(IS_ANDROID)
 const char kSharedArrayBufferUnrestrictedAccessAllowed[] =
     "shared-array-buffer-unrestricted-access-allowed";
diff --git a/content/public/common/user_agent.h b/content/public/common/user_agent.h
index 323f5db4..a7b1917a 100644
--- a/content/public/common/user_agent.h
+++ b/content/public/common/user_agent.h
@@ -58,7 +58,7 @@
 CONTENT_EXPORT std::string GetReducedUserAgent(bool mobile,
                                                std::string major_version);
 
-// TODO(crbug.com/1257310): Remove this after user agent reduction phase 5 and
+// TODO(crbug.com/40200617): Remove this after user agent reduction phase 5 and
 // --force-major-version-to-minor is removed.
 // Return the <unifiedPlatform> token of a reduced User-Agent header.
 CONTENT_EXPORT std::string GetUnifiedPlatformForTesting();
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index 9b6b015..a2d27a3 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -500,11 +500,12 @@
   // Don't send accessibility events for frames that don't yet have an tree id
   // as doing so will cause the browser to discard that message and all
   // subsequent ones.
-  // TODO(1231184): There are some cases where no content is currently rendered,
-  // due to an iframe returning 204 or window.stop() being called. In these
-  // cases there will never be an AXTreeID as there is no commit, which will
-  // prevent accessibility updates from ever being sent even if the rendering is
-  // fixed. See also other TODOs related to 1231184 in this file.
+  // TODO(crbug.com/40190596): There are some cases where no content is
+  // currently rendered, due to an iframe returning 204 or window.stop() being
+  // called. In these cases there will never be an AXTreeID as there is no
+  // commit, which will prevent accessibility updates from ever being sent even
+  // if the rendering is fixed. See also other TODOs related to 1231184 in this
+  // file.
   DCHECK(render_frame_->GetWebFrame()->GetAXTreeID().token());
 
   WebDocument document = GetMainDocument();
diff --git a/content/renderer/media/win/dcomp_texture_wrapper_impl.cc b/content/renderer/media/win/dcomp_texture_wrapper_impl.cc
index c1a3427..afeca6c 100644
--- a/content/renderer/media/win/dcomp_texture_wrapper_impl.cc
+++ b/content/renderer/media/win/dcomp_texture_wrapper_impl.cc
@@ -177,7 +177,7 @@
     // The SI backing this VideoFrame will be read by the display compositor and
     // raster. The latter will be over GL if not using OOP-R. NOTE: GL usage can
     // be eliminated once OOP-R ships definitively.
-    // TODO(crbug.com/1494911): Check the potential inconsistency between the
+    // TODO(crbug.com/40286368): Check the potential inconsistency between the
     // |usage| passed to NotifyMailboxAdded() here and the |usage| that
     // DCOMPTextureBacking's constructor uses to initialize
     // ClearTrackingSharedImageBacking.
diff --git a/content/renderer/pepper/event_conversion.cc b/content/renderer/pepper/event_conversion.cc
index a2cb3ef..ae00ba0 100644
--- a/content/renderer/pepper/event_conversion.cc
+++ b/content/renderer/pepper/event_conversion.cc
@@ -331,7 +331,7 @@
   pt.pointer_type = blink::WebPointerProperties::PointerType::kTouch;
   pt.id = pp_pt.id;
   pt.SetPositionInWidget(pp_pt.position.x, pp_pt.position.y);
-  // TODO(crbug.com/93902): Add screen coordinate calculation.
+  // TODO(crbug.com/40616919): Add screen coordinate calculation.
   pt.SetPositionInScreen(0, 0);
   pt.force = pp_pt.pressure;
   pt.radius_x = pp_pt.radius.x;
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 9ffccbe..1f7ee84 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -464,7 +464,7 @@
   // "document URL") and history URL (used as the "unreachable URL"/"URL for
   // history"). However, we want to return the data: URL (the URL originally
   // sent by the browser to commit the navigation) here.
-  // TODO(https://crbug.com/1223408): Since the DocumentState stays as long as
+  // TODO(crbug.com/40187600): Since the DocumentState stays as long as
   // the Document stays the same, this means the data: URL will be returned even
   // after same-document navigations. Investigate whether this is intended or
   // not.
@@ -6212,7 +6212,7 @@
   if (net::DataURL::Parse(data_url, mime_type, charset, data)) {
     // Since the base URL will also be used as the document URL, we should not
     // use an empty URL. If it's empty, use the data: URL as a fallback.
-    // TODO(https://crbug.com/1223403): Maybe this should consider
+    // TODO(crbug.com/40187599): Maybe this should consider
     // `data_url_as_string` too. Otherwise, the base URL might be set to the
     // data: URL header with empty data, instead of the data: URL that contains
     // the actual data.
@@ -6672,7 +6672,7 @@
     auto pip_mojom_opts = blink::mojom::PictureInPictureWindowOptions::New();
     pip_mojom_opts->width = pip_options->width;
     pip_mojom_opts->height = pip_options->height;
-    // TODO(crbug.com/1444658): Remove this from mojom and the browser side.
+    // TODO(crbug.com/40911987): Remove this from mojom and the browser side.
     pip_mojom_opts->initial_aspect_ratio = 0.0;
     // TODO(crbug.com/1410379): Remove this from mojom and the browser side.
     pip_mojom_opts->lock_aspect_ratio = false;
diff --git a/content/services/auction_worklet/trusted_signals_request_manager.h b/content/services/auction_worklet/trusted_signals_request_manager.h
index fee0eca..dd9b160d 100644
--- a/content/services/auction_worklet/trusted_signals_request_manager.h
+++ b/content/services/auction_worklet/trusted_signals_request_manager.h
@@ -36,7 +36,7 @@
 // Manages trusted signals requests and responses. Currently only batches
 // requests.
 //
-// TODO(https://crbug.com/1276639): Cache responses as well.
+// TODO(crbug.com/40207533): Cache responses as well.
 class CONTENT_EXPORT TrustedSignalsRequestManager {
  public:
   // Delay between construction of a Request and automatically starting a
diff --git a/content/shell/browser/shell_federated_permission_context.cc b/content/shell/browser/shell_federated_permission_context.cc
index f2ac5f0f..0a652dc 100644
--- a/content/shell/browser/shell_federated_permission_context.cc
+++ b/content/shell/browser/shell_federated_permission_context.cc
@@ -209,7 +209,7 @@
     observer.OnIdpSigninStatusReceived(idp_origin, idp_signin_status);
   }
 
-  // TODO(crbug.com/1382989): Replace this with AddIdpSigninStatusObserver.
+  // TODO(crbug.com/40245925): Replace this with AddIdpSigninStatusObserver.
   if (idp_signin_status_closure_)
     idp_signin_status_closure_.Run();
 }
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 7b00405f..cd311b6 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1692,7 +1692,7 @@
       "../browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc",
       "../browser/network/quic_connection_migration_android_browsertest.cc",
 
-      # TODO(https://crbug.com/1442929): move out of Android once we can capture
+      # TODO(crbug.com/40267166): move out of Android once we can capture
       # for other platforms.
       "../browser/renderer_host/navigation_transitions/navigation_entry_screenshot_browsertest.cc",
     ]
@@ -2895,7 +2895,7 @@
     additional_manifest_fragments = [
       "//build/config/fuchsia/test/fonts.shard.test-cml",
 
-      # TODO(https://crbug.com/1185811): Investigate removing the requirement
+      # TODO(crbug.com/40055105): Investigate removing the requirement
       # for VmexResource.
       "//build/config/fuchsia/test/mark_vmo_executable.shard.test-cml",
       "//build/config/fuchsia/test/network.shard.test-cml",
@@ -3500,7 +3500,7 @@
 # test_buildbucket_api_gpu_cases.py on bots. This also tells the build system
 # when the tests should be re-run - when one of the dependent files changes.
 #
-# TODO(crbug.com/1080749): Remove once power testing is migrated to perf waterfall.
+# TODO(crbug.com/40130215): Remove once power testing is migrated to perf waterfall.
 group("test_buildbucket_api_gpu_use_cases") {
   data = [
     # The test runner and its dependencies.
diff --git a/content/test/data/forms/form_controls_browsertest_button_win.png b/content/test/data/forms/form_controls_browsertest_button_win.png
index b425e0f..d86595b7 100644
--- a/content/test/data/forms/form_controls_browsertest_button_win.png
+++ b/content/test/data/forms/form_controls_browsertest_button_win.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_checkbox_win.png b/content/test/data/forms/form_controls_browsertest_checkbox_win.png
index 27342a78..f4a364c 100644
--- a/content/test/data/forms/form_controls_browsertest_checkbox_win.png
+++ b/content/test/data/forms/form_controls_browsertest_checkbox_win.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_color_input_win.png b/content/test/data/forms/form_controls_browsertest_color_input_win.png
index d02f2852..57cadb7 100644
--- a/content/test/data/forms/form_controls_browsertest_color_input_win.png
+++ b/content/test/data/forms/form_controls_browsertest_color_input_win.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_win.png b/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_win.png
index 0193e49..e8985d2d 100644
--- a/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_win.png
+++ b/content/test/data/forms/form_controls_browsertest_dark_mode_text_selection_win.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_input_win.png b/content/test/data/forms/form_controls_browsertest_input_win.png
index a58c8f14..2790f738c 100644
--- a/content/test/data/forms/form_controls_browsertest_input_win.png
+++ b/content/test/data/forms/form_controls_browsertest_input_win.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_meter_win.png b/content/test/data/forms/form_controls_browsertest_meter_win.png
index 1b00a8b..73b8845 100644
--- a/content/test/data/forms/form_controls_browsertest_meter_win.png
+++ b/content/test/data/forms/form_controls_browsertest_meter_win.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_multi_select_win.png b/content/test/data/forms/form_controls_browsertest_multi_select_win.png
index 7e7984a..e867deb8 100644
--- a/content/test/data/forms/form_controls_browsertest_multi_select_win.png
+++ b/content/test/data/forms/form_controls_browsertest_multi_select_win.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_progress_win.png b/content/test/data/forms/form_controls_browsertest_progress_win.png
index 3197f23..8fb3cd950 100644
--- a/content/test/data/forms/form_controls_browsertest_progress_win.png
+++ b/content/test/data/forms/form_controls_browsertest_progress_win.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_radio_win.png b/content/test/data/forms/form_controls_browsertest_radio_win.png
index 00576c64..172fbf9 100644
--- a/content/test/data/forms/form_controls_browsertest_radio_win.png
+++ b/content/test/data/forms/form_controls_browsertest_radio_win.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_range_win.png b/content/test/data/forms/form_controls_browsertest_range_win.png
index 9eb052c..d90da00 100644
--- a/content/test/data/forms/form_controls_browsertest_range_win.png
+++ b/content/test/data/forms/form_controls_browsertest_range_win.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_select_win.png b/content/test/data/forms/form_controls_browsertest_select_win.png
index 51ca511..225667d4 100644
--- a/content/test/data/forms/form_controls_browsertest_select_win.png
+++ b/content/test/data/forms/form_controls_browsertest_select_win.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_textarea_win.png b/content/test/data/forms/form_controls_browsertest_textarea_win.png
index 1940e9d..26083754 100644
--- a/content/test/data/forms/form_controls_browsertest_textarea_win.png
+++ b/content/test/data/forms/form_controls_browsertest_textarea_win.png
Binary files differ
diff --git a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
index 768fc79..a57ef98 100644
--- a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
@@ -231,6 +231,7 @@
 crbug.com/329138770 [ win graphite-enabled ] WebGPUCachingTraceTest_RenderPipelineCrossOriginsCacheMisses [ Failure ]
 crbug.com/329138770 [ win graphite-enabled ] WebGPUCachingTraceTest_RenderPipelineDifferentOrigins [ Failure ]
 crbug.com/329138770 [ win graphite-enabled ] WebGPUCachingTraceTest_RenderPipelineIncognito [ Failure ]
+crbug.com/335564847 [ win graphite-enabled ] VideoPathTraceTest_DirectComposition_* [ Failure ]
 
 # Failures on fuchsia
 crbug.com/40935289 [ fuchsia web-engine-shell ] WebGLCanvasCaptureTraceTest_VideoStreamFromWebGLCanvas_OneCopy [ Failure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index f4026dc..998bdde 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -850,7 +850,6 @@
 crbug.com/1221362 [ chromeos chromeos-board-amd64-generic ] conformance2/rendering/blitframebuffer-filter-outofbounds.html [ Failure ]
 crbug.com/1223542 [ chromeos chromeos-board-amd64-generic ] deqp/functional/gles3/framebufferblit/rect_03.html [ Failure ]
 crbug.com/1223542 [ chromeos chromeos-board-amd64-generic ] deqp/functional/gles3/framebufferblit/rect_04.html [ Failure ]
-crbug.com/332890145 [ chromeos chromeos-board-amd64-generic ] conformance2/extensions/ext-disjoint-timer-query-webgl2.html [ Failure ]
 
 crbug.com/326755442 [ chromeos intel mesa_ge_21.0 passthrough ] conformance2/extensions/ext-render-snorm.html [ Failure ]
 
@@ -913,7 +912,6 @@
 # Lacros failures #
 #####################
 
-crbug.com/angleproject/7904 [ chromeos lacros-chrome chromeos-board-octopus passthrough ] WebglExtension_WEBGL_clip_cull_distance [ Failure ]
 crbug.com/324952609 [ chromeos lacros-chrome chromeos-board-octopus passthrough ] conformance2/extensions/oes-draw-buffers-indexed.html [ Failure ]
 
 crbug.com/1446435 [ chromeos lacros-chrome chromeos-board-jacuzzi passthrough ] conformance/glsl/bugs/constant-precision-qualifier.html [ Failure ]
diff --git a/content/web_test/BUILD.gn b/content/web_test/BUILD.gn
index cfbd8ee1..78bfd88 100644
--- a/content/web_test/BUILD.gn
+++ b/content/web_test/BUILD.gn
@@ -349,7 +349,7 @@
     "//media/capture",
     "//printing/buildflags",
 
-    # TODO(crbug.com/1200443) Remove //printing/mojom requirement coming from
+    # TODO(crbug.com/40178248) Remove //printing/mojom requirement coming from
     # //third_party/blink/public:blink_headers.
     "//printing/mojom",
     "//services/service_manager/public/cpp",
diff --git a/content/web_test/renderer/test_runner.cc b/content/web_test/renderer/test_runner.cc
index 0714a0e0..2dd050c 100644
--- a/content/web_test/renderer/test_runner.cc
+++ b/content/web_test/renderer/test_runner.cc
@@ -2152,7 +2152,7 @@
   GetWebFrame()->CopyImageAtForTesting(gfx::Point(x, y));
   auto sequence_number_after = sequence_number_before;
   while (sequence_number_before.value() == sequence_number_after.value()) {
-    // TODO(crbug.com/872076): Ideally we would CHECK here that the mojo call
+    // TODO(crbug.com/40588468): Ideally we would CHECK here that the mojo call
     // succeeded, but this crashes under some circumstances (crbug.com/1232810).
     remote_clipboard->GetSequenceNumber(ui::ClipboardBuffer::kCopyPaste,
                                         &sequence_number_after);
diff --git a/content/zygote/zygote_linux.cc b/content/zygote/zygote_linux.cc
index 613f4bc..a585cd0 100644
--- a/content/zygote/zygote_linux.cc
+++ b/content/zygote/zygote_linux.cc
@@ -430,7 +430,7 @@
     fds.push_back(pid_oracle.get());  // kPIDOracleFDIndex
     fds.push_back(field_trial_fd);    // kFieldTrialFDIndex
     if (histograms_fd != -1) {
-      // TODO(crbug/1028263): pass unconditionally once the metrics shared
+      // TODO(crbug.com/40109064): pass unconditionally once the metrics shared
       // memory region is always passed on startup.
       fds.push_back(histograms_fd);  // kHistogramFDIndex
     }
diff --git a/device/bluetooth/bluetooth_adapter.h b/device/bluetooth/bluetooth_adapter.h
index 136102c..e2fcb402 100644
--- a/device/bluetooth/bluetooth_adapter.h
+++ b/device/bluetooth/bluetooth_adapter.h
@@ -519,7 +519,7 @@
   // being connected by Chromium, into |devices_|. This method is useful since
   // a discovery session cannot find devices that are already connected to the
   // computer.
-  // TODO(crbug.com/653032): Needs to be implemented for Android and Windows.
+  // TODO(crbug.com/40487754): Needs to be implemented for Android and Windows.
   virtual std::unordered_map<BluetoothDevice*, BluetoothDevice::UUIDSet>
   RetrieveGattConnectedDevicesWithDiscoveryFilter(
       const BluetoothDiscoveryFilter& discovery_filter);
diff --git a/device/bluetooth/public/mojom/device.mojom b/device/bluetooth/public/mojom/device.mojom
index ab506e93..4ca4233 100644
--- a/device/bluetooth/public/mojom/device.mojom
+++ b/device/bluetooth/public/mojom/device.mojom
@@ -22,7 +22,7 @@
 // contains additional properties pertaining to the characteristic.
 // The properties |RELIABLE_WRITE| and |WRITABLE_AUXILIARIES| are retrieved from
 // that characteristic.
-// TODO(crbug.com/684168): Remove assignment of values when this is automated.
+// TODO(crbug.com/40502994): Remove assignment of values when this is automated.
 enum Property {
   NONE = 0,
   BROADCAST = 1,
diff --git a/device/fido/cable/fido_cable_discovery.cc b/device/fido/cable/fido_cable_discovery.cc
index e9e7263..1c1cf9a 100644
--- a/device/fido/cable/fido_cable_discovery.cc
+++ b/device/fido/cable/fido_cable_discovery.cc
@@ -308,8 +308,8 @@
   // the adapter, such that one of the WinRT API calls inside
   // BluetoothAdapter::StartDiscoverySessionWithFilter() can fail with "Device
   // not ready for use". So wait for things to actually be ready.
-  // TODO(crbug/1046140): Remove this delay once the Bluetooth layer handles
-  // the spurious failure.
+  // TODO(crbug.com/40670639): Remove this delay once the Bluetooth layer
+  // handles the spurious failure.
   base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
       FROM_HERE,
       base::BindOnce(&FidoCableDiscovery::StartCableDiscovery,
diff --git a/device/vr/android/arcore/ar_compositor_frame_sink.cc b/device/vr/android/arcore/ar_compositor_frame_sink.cc
index 74d35e0..6331575 100644
--- a/device/vr/android/arcore/ar_compositor_frame_sink.cc
+++ b/device/vr/android/arcore/ar_compositor_frame_sink.cc
@@ -297,7 +297,7 @@
     const viz::FrameTimingDetailsMap& timing_details,
     bool frame_ack,
     std::vector<viz::ReturnedResource> resources) {
-  // TODO(crbug.com/1401032): Determine why the timing of this Ack leads to
+  // TODO(crbug.com/40250552): Determine why the timing of this Ack leads to
   // frame production stopping in tests.
   if (features::IsOnBeginFrameAcksEnabled()) {
     if (frame_ack) {
diff --git a/device/vr/android/arcore/ar_image_transport.h b/device/vr/android/arcore/ar_image_transport.h
index 80c5f15..1eda369 100644
--- a/device/vr/android/arcore/ar_image_transport.h
+++ b/device/vr/android/arcore/ar_image_transport.h
@@ -41,7 +41,7 @@
   // a scoped_refptr<gpu::ClientSharedImage> with that texture copied
   // to a shared buffer. The two values are currently returned
   // together via a wrapping WebXrSharedBuffer.
-  // TODO(crbug.com/1494911): Change the return type to
+  // TODO(crbug.com/40286368): Change the return type to
   // scoped_refptr<gpu::ClientSharedImage> once the sync token is
   // incorporated into ClientSharedImage.
   virtual WebXrSharedBuffer* TransferCameraImageFrame(
diff --git a/device/vr/android/xr_image_transport_base.h b/device/vr/android/xr_image_transport_base.h
index 2a976e1f..9a792f3 100644
--- a/device/vr/android/xr_image_transport_base.h
+++ b/device/vr/android/xr_image_transport_base.h
@@ -73,7 +73,7 @@
   // suitable to transfer to another process to allow it to write to the
   // shared buffer. The two values are currently returned together via
   // a wrapping WebXrSharedBuffer.
-  // TODO(crbug.com/1494911): Change the return type to
+  // TODO(crbug.com/40286368): Change the return type to
   // scoped_refptr<gpu::ClientSharedImage> once the sync token is
   // incorporated into ClientSharedImage.
   virtual WebXrSharedBuffer* TransferFrame(WebXrPresentationState* webxr,
diff --git a/docs/experiments/compression-dictionary-transport.md b/docs/experiments/compression-dictionary-transport.md
index 71ee498518..10f0fdb 100644
--- a/docs/experiments/compression-dictionary-transport.md
+++ b/docs/experiments/compression-dictionary-transport.md
@@ -74,7 +74,7 @@
 Therefore, we are conducting experiments to ensure that this does not cause
 regressions before rolling it out to all users.
 
-TODO(crbug.com/1413922): When we enable the backend for all Chrome, remove this
+TODO(crbug.com/40255884): When we enable the backend for all Chrome, remove this
 section.
 
 ## Feature detection
diff --git a/extensions/browser/api/feedback_private/feedback_service_unittest.cc b/extensions/browser/api/feedback_private/feedback_service_unittest.cc
index a905201..c278420 100644
--- a/extensions/browser/api/feedback_private/feedback_service_unittest.cc
+++ b/extensions/browser/api/feedback_private/feedback_service_unittest.cc
@@ -299,7 +299,7 @@
                     feedback::FeedbackReport::kMemUsageWithTabTitlesKey));
 }
 
-// TODO(crbug.com/1439227): Re-enable this test
+// TODO(crbug.com/40908623): Re-enable this test
 TEST_F(FeedbackServiceTest, DISABLED_SendFeedbackDoNotSendTabTitles) {
   TestSendFeedbackConcerningTabTitles(false);
   EXPECT_EQ(0u, feedback_data_->sys_info()->count(
diff --git a/extensions/browser/event_router.cc b/extensions/browser/event_router.cc
index d18bbea..4de5553 100644
--- a/extensions/browser/event_router.cc
+++ b/extensions/browser/event_router.cc
@@ -1442,7 +1442,7 @@
     // event. This can happen if the extension asynchronously registers event
     // listeners. In this case, notify the caller (if they subscribed via a
     // callback) and drop the event.
-    // TODO(https://crbug.com/161155): We should provide feedback to
+    // TODO(crbug.com/40954888): We should provide feedback to
     // developers (e.g. emit a warning) when an event has no listeners.
     event->cannot_dispatch_callback.Run();
   }
diff --git a/extensions/browser/extension_function_dispatcher.cc b/extensions/browser/extension_function_dispatcher.cc
index 0863727..3c8066f 100644
--- a/extensions/browser/extension_function_dispatcher.cc
+++ b/extensions/browser/extension_function_dispatcher.cc
@@ -179,7 +179,7 @@
     return bad_message::EFD_INVALID_EXTENSION_ID_FOR_PROCESS;
   }
 
-  // TODO(https://crbug.com/1186447): Validate `params.user_gesture`.
+  // TODO(crbug.com/40055124): Validate `params.user_gesture`.
 
   return std::nullopt;
 }
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc
index 25f5616d..d3513ab 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc
@@ -50,7 +50,7 @@
 
 namespace {
 
-// TODO(crbug.com/659750): Make this a proper resource.
+// TODO(crbug.com/40490789): Make this a proper resource.
 constexpr char kFullPageMimeHandlerViewHTML[] =
     "<!doctype html><html><body style='height: 100%%; width: 100%%; overflow: "
     "hidden; margin:0px; background-color: rgb(%d, %d, %d);'><embed "
diff --git a/fuchsia_web/webengine/browser/frame_impl.cc b/fuchsia_web/webengine/browser/frame_impl.cc
index 0438085..190aec1 100644
--- a/fuchsia_web/webengine/browser/frame_impl.cc
+++ b/fuchsia_web/webengine/browser/frame_impl.cc
@@ -217,7 +217,7 @@
     const content::MediaStreamRequest& request,
     content::MediaResponseCallback callback,
     const std::vector<blink::mojom::PermissionStatus>& result) {
-  // TODO(crbug.com/1300883): Generalize to multiple streams.
+  // TODO(crbug.com/40216442): Generalize to multiple streams.
   blink::mojom::StreamDevicesPtr devices = blink::mojom::StreamDevices::New();
 
   int result_pos = 0;
@@ -1535,7 +1535,7 @@
       return false;
   }
 
-  // TODO(crbug.com/1321100): Remove `security_origin`.
+  // TODO(crbug.com/40223767): Remove `security_origin`.
   if (security_origin != render_frame_host->GetLastCommittedOrigin()) {
     return false;
   }
diff --git a/gin/function_template.h b/gin/function_template.h
index cc6b966..51b2c5d7 100644
--- a/gin/function_template.h
+++ b/gin/function_template.h
@@ -54,7 +54,7 @@
 //   that even _if_ we become garbage, we might never get collected!)
 // - If the isolate gets disposed.
 //
-// TODO(crbug.com/1285119): When gin::Wrappable gets migrated over to using
+// TODO(crbug.com/40210365): When gin::Wrappable gets migrated over to using
 //   cppgc, this class should also be considered for migration.
 
 // This simple base class is used so that we can share a single object template
diff --git a/google_apis/gaia/oauth_multilogin_result.cc b/google_apis/gaia/oauth_multilogin_result.cc
index 08d12bbe9..ca340c8 100644
--- a/google_apis/gaia/oauth_multilogin_result.cc
+++ b/google_apis/gaia/oauth_multilogin_result.cc
@@ -107,7 +107,7 @@
     const std::string* same_site = cookie_dict.FindString("sameSite");
 
     base::Time now = base::Time::Now();
-    // TODO(crbug.com/1264458) If CreateSanitizedCookie were used below, this
+    // TODO(crbug.com/40800807) If CreateSanitizedCookie were used below, this
     // wouldn't be needed and ValidateAndAdjustExpiryDate could be moved back
     // into anon namespace instead of being exposed as a static function.
     // Alternatly, if we were sure GAIA cookies wouldn't try to expire more
diff --git a/gpu/command_buffer/client/client_shared_image.h b/gpu/command_buffer/client/client_shared_image.h
index c0811d9..5e1956c 100644
--- a/gpu/command_buffer/client/client_shared_image.h
+++ b/gpu/command_buffer/client/client_shared_image.h
@@ -180,7 +180,7 @@
   // Returns an unowned copy of the current ClientSharedImage. This function
   // is a temporary workaround for the situation where a ClientSharedImage may
   // have more than one reference when being destroyed.
-  // TODO(crbug.com/1494911): Remove this function once ClientSharedImage
+  // TODO(crbug.com/40286368): Remove this function once ClientSharedImage
   // can properly handle shared image destruction internally.
   scoped_refptr<ClientSharedImage> MakeUnowned();
 
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 98a6225..cb7ef2ad 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -6612,7 +6612,7 @@
         // Overall reliable driver support for timestamps is limited, so we
         // disable the timestamp portion of this extension to encourage use of
         // the better supported time elapsed queries.
-        // TODO(crbug.com/1411579): Check the underlying driver's capability
+        // TODO(crbug.com/40254878): Check the underlying driver's capability
         // instead of disabling it directly.
         *params = 0;
         break;
diff --git a/gpu/command_buffer/client/shared_image_interface.h b/gpu/command_buffer/client/shared_image_interface.h
index 16984772..5ffd7593 100644
--- a/gpu/command_buffer/client/shared_image_interface.h
+++ b/gpu/command_buffer/client/shared_image_interface.h
@@ -131,7 +131,7 @@
   // same format which would be passed to glTexImage2D to populate a similarly
   // specified texture.
   // May return null if |pixel_data| is too big for IPC.
-  // TODO(crbug.com/1447106): Have the caller specify a row span for
+  // TODO(crbug.com/40268891): Have the caller specify a row span for
   // |pixel_data| explicitly. Some backings have different row alignment
   // requirements which the caller has to match exactly or it won't work.
   virtual scoped_refptr<ClientSharedImage> CreateSharedImage(
diff --git a/gpu/command_buffer/service/copy_shared_image_helper.cc b/gpu/command_buffer/service/copy_shared_image_helper.cc
index d101863..d1ad2f3 100644
--- a/gpu/command_buffer/service/copy_shared_image_helper.cc
+++ b/gpu/command_buffer/service/copy_shared_image_helper.cc
@@ -816,7 +816,7 @@
                            ToSkYUVAPlaneConfig(dest_format),
                            ToSkYUVASubsampling(dest_format), yuv_color_space);
       // Perform skia::BlitRGBAToYUVA for the multiplanar YUV format image.
-      // TODO(crbug.com/1451025): This will scale the image if the source image
+      // TODO(crbug.com/40270413): This will scale the image if the source image
       // is smaller than the destination image. What we should actually do
       // instead is just blit the destination rect and clear out the rest.
       // However, doing that resulted in resulted in pixeltest failures due to
diff --git a/gpu/command_buffer/service/passthrough_program_cache.h b/gpu/command_buffer/service/passthrough_program_cache.h
index 33a340f..091c0bd 100644
--- a/gpu/command_buffer/service/passthrough_program_cache.h
+++ b/gpu/command_buffer/service/passthrough_program_cache.h
@@ -95,7 +95,7 @@
    private:
     Value program_blob_;
 
-    // TODO(crbug.com/1132792): Change this into raw_ptr<...>, after
+    // TODO(crbug.com/40150759): Change this into raw_ptr<...>, after
     // investigating an earlier crash report most likely caused by a
     // use-after-move.
     RAW_PTR_EXCLUSION PassthroughProgramCache* program_cache_;
diff --git a/gpu/command_buffer/service/scheduler_dfs.cc b/gpu/command_buffer/service/scheduler_dfs.cc
index f6b32158c..3f1784c 100644
--- a/gpu/command_buffer/service/scheduler_dfs.cc
+++ b/gpu/command_buffer/service/scheduler_dfs.cc
@@ -641,7 +641,7 @@
       // runnable sequences. Change logic to check for that too (that changes
       // old behavior - so leaving for now).
 
-      // TODO(crbug.com/1472145): this assert is firing frequently on
+      // TODO(crbug.com/40278526): this assert is firing frequently on
       // Release builds with dcheck_always_on on Intel Macs. It looks
       // like it happens when the browser drops frames.
       /*
diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc
index f3407a7..ad51ffd 100644
--- a/gpu/command_buffer/service/shared_context_state.cc
+++ b/gpu/command_buffer/service/shared_context_state.cc
@@ -889,7 +889,7 @@
 
     // Only abandon the GrContext if it is owned by SharedContextState, because
     // the passed in GrContext will be reused.
-    // TODO(https://crbug.com/1048692): always abandon GrContext to release all
+    // TODO(crbug.com/40672147): always abandon GrContext to release all
     // resources when chrome goes into background with low end device.
     if (owned_gr_context_) {
       owned_gr_context_->abandonContext();
diff --git a/gpu/command_buffer/service/shared_image/compound_image_backing.h b/gpu/command_buffer/service/shared_image/compound_image_backing.h
index f9f473f..d951206 100644
--- a/gpu/command_buffer/service/shared_image/compound_image_backing.h
+++ b/gpu/command_buffer/service/shared_image/compound_image_backing.h
@@ -41,7 +41,7 @@
 // A compound backing that combines a shared memory backing and real GPU
 // backing. The real GPU backing must implement `UploadFromMemory()` and not
 // have it's own shared memory segment.
-// TODO(crbug.com/1293509): Support multiple GPU backings.
+// TODO(crbug.com/40213543): Support multiple GPU backings.
 class GPU_GLES2_EXPORT CompoundImageBacking : public SharedImageBacking {
  public:
   using CreateBackingCallback =
@@ -88,7 +88,7 @@
   // provided by `gpu_backing_factory`. We additionally pass a |buffer_usage|
   // parameter here in order to create a CPU mappable by creating a shared
   // memory handle.
-  // TODO(crbug.com/1467670): Remove this method once we figure out the mapping
+  // TODO(crbug.com/40276878): Remove this method once we figure out the mapping
   // between SharedImageUsage and BufferUsage and no longer need to use
   // BufferUsage.
   static std::unique_ptr<SharedImageBacking> CreateSharedMemory(
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
index 692b8e5c..7db1f07 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
@@ -153,8 +153,8 @@
 // static
 bool D3DImageBackingFactory::IsSwapChainSupported(
     const GpuPreferences& gpu_preferences) {
-  // TODO(crbug.com/1492685): enable swapchain support when d3d11 is shared with
-  // ANGLE.
+  // TODO(crbug.com/40074896): enable swapchain support when d3d11 is shared
+  // with ANGLE.
   return gl::DirectCompositionSupported() &&
          gl::DXGISwapChainTearingSupported() &&
          gpu_preferences.gr_context_type == GrContextType::kGL;
@@ -384,7 +384,7 @@
       has_webgpu_usage ||
       (has_gl_usage && (d3d11_device_ != angle_d3d11_device_));
   if (needs_shared_handle) {
-    // TODO(crbug.com/1468604): Many texture formats cannot be shared on old
+    // TODO(crbug.com/40068319): Many texture formats cannot be shared on old
     // GPUs/drivers to try to detect that and implement a fallback path or
     // disallow Graphite/WebGPU in those cases.
     desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_NTHANDLE |
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_skia_representation.cc b/gpu/command_buffer/service/shared_image/external_vk_image_skia_representation.cc
index 992ff72..181d9ee 100644
--- a/gpu/command_buffer/service/shared_image/external_vk_image_skia_representation.cc
+++ b/gpu/command_buffer/service/shared_image/external_vk_image_skia_representation.cc
@@ -233,7 +233,7 @@
   DCHECK_NE(access_mode_, AccessMode::kNone);
   DCHECK(backing_impl()->need_synchronization() || !end_access_semaphore_);
 
-  // TODO(crbug.com/1307914): This check is specific to the interop case i.e.
+  // TODO(crbug.com/40218936): This check is specific to the interop case i.e.
   // when need_synchronization() is true, but we can generalize this by making
   // the client TakeEndState() and asserting that the |end_state_| is null here.
 #if DCHECK_IS_ON()
diff --git a/gpu/command_buffer/service/shared_image/iosurface_image_backing.mm b/gpu/command_buffer/service/shared_image/iosurface_image_backing.mm
index dd081678..455fe9a 100644
--- a/gpu/command_buffer/service/shared_image/iosurface_image_backing.mm
+++ b/gpu/command_buffer/service/shared_image/iosurface_image_backing.mm
@@ -1436,7 +1436,7 @@
   if (io_surface_format_ == 'BGRA') {
     wgpu_format = wgpu::TextureFormat::BGRA8Unorm;
   }
-  // TODO(crbug.com/1293514): Remove these if conditions after using single
+  // TODO(crbug.com/40213546): Remove these if conditions after using single
   // multiplanar mailbox for which wgpu_format should already be correct.
   if (io_surface_format_ == '420v') {
     wgpu_format = wgpu::TextureFormat::R8BG8Biplanar420Unorm;
diff --git a/gpu/command_buffer/service/shared_image/ozone_image_backing.cc b/gpu/command_buffer/service/shared_image/ozone_image_backing.cc
index 1b24a17..66f127f 100644
--- a/gpu/command_buffer/service/shared_image/ozone_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/ozone_image_backing.cc
@@ -383,7 +383,7 @@
         context_state->vk_context_provider()->GetVulkanImplementation();
 
     std::vector<std::unique_ptr<VulkanImage>> vulkan_images;
-    // TODO(crbug.com/1366495): Eliminate these branches once we migrate
+    // TODO(crbug.com/40239769): Eliminate these branches once we migrate
     // completely to MultiplanarSharedImage.
     if (format().is_single_plane()) {
       DCHECK(!format().IsLegacyMultiplanar() ||
diff --git a/gpu/command_buffer/service/shared_image/shared_image_backing_factory.h b/gpu/command_buffer/service/shared_image/shared_image_backing_factory.h
index 34a75fd9..f265eb3 100644
--- a/gpu/command_buffer/service/shared_image/shared_image_backing_factory.h
+++ b/gpu/command_buffer/service/shared_image/shared_image_backing_factory.h
@@ -90,7 +90,7 @@
   // This new api is introduced for MappableSI work where client code sends
   // |buffer_usage| info while creating shared image. This info is used in some
   // backings to create native handle.
-  // TODO(crbug.com/1466569) : Remove this api once the MappableSI is complete
+  // TODO(crbug.com/40276430) : Remove this api once the MappableSI is complete
   // and we have a mapping between shared image usage and BufferUsage.
   virtual std::unique_ptr<SharedImageBacking> CreateSharedImage(
       const Mailbox& mailbox,
diff --git a/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc b/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc
index 2f8f377..7afabf7 100644
--- a/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc
+++ b/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc
@@ -511,7 +511,7 @@
         return wgpu::TextureFormat::R16Float;
     }
   } else if (format.IsLegacyMultiplanar()) {
-    // TODO(crbug.com/1366495): Remove legacy multiplanar checks once
+    // TODO(crbug.com/40239769): Remove legacy multiplanar checks once
     // multiplanar SI support lands.
     if (format == viz::LegacyMultiPlaneFormat::kNV12 ||
         format == viz::LegacyMultiPlaneFormat::kNV12A) {
@@ -549,7 +549,7 @@
   if (is_dcomp_surface) {
     // Textures from DComp surfaces cannot be used as TextureBinding, however
     // DCompSurfaceImageBacking creates a textureable intermediate texture.
-    // TODO(crbug.com/1468844): Remove TextureBinding usage when the
+    // TODO(crbug.com/40277263): Remove TextureBinding usage when the
     // intermediate workaround is remove.
     return usage | wgpu::TextureUsage::RenderAttachment |
            wgpu::TextureUsage::CopySrc | wgpu::TextureUsage::CopyDst;
diff --git a/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing.cc b/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing.cc
index 27af427..0118aff 100644
--- a/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing.cc
@@ -225,7 +225,7 @@
     // Filling blue causes slight pixel difference, so linux-ref and
     // linux-blink-ref bots cannot share the same baseline for webtest.
     // So remove this color for this call for dcheck on build for now.
-    // TODO(crbug.com/1330278): add it back.
+    // TODO(crbug.com/40227119): add it back.
     texture.backend_texture =
         context_state_->gr_context()->createBackendTexture(
             plane_size.width(), plane_size.height(), GetSkColorType(plane),
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc
index 374c7b6..feeda1e5 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -1892,7 +1892,7 @@
     return error::kLostContext;
   }
 
-  // TODO(crbug.com/1174145): This is O(N) where N is the number of devices.
+  // TODO(crbug.com/40167398): This is O(N) where N is the number of devices.
   // Multiple submits would be O(N*M). We should find a way to more
   // intelligently poll for work on only the devices that need it.
   PerformPollingWork();
diff --git a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
index e6f350d..cf7628e 100644
--- a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
+++ b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
@@ -204,7 +204,7 @@
   }
 
   switch (dest_internal_format) {
-    // TODO(crbug.com/577144): Enable GL_ALPHA, GL_LUMINANCE and
+    // TODO(crbug.com/40452138): Enable GL_ALPHA, GL_LUMINANCE and
     // GL_LUMINANCE_ALPHA.
     case GL_R8:
     case GL_R16F:
@@ -637,7 +637,7 @@
     DCHECK(!ShouldSkipTest());
 #if (BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \
     (defined(ARCH_CPU_X86) || defined(ARCH_CPU_X86_64))
-    // // TODO(crbug.com/1046873): Fails on mac and linux intel.
+    // // TODO(crbug.com/40671060): Fails on mac and linux intel.
     return true;
 #else
     return false;
@@ -664,7 +664,7 @@
       return;
     }
     if (IsMacArm64()) {
-      LOG(INFO) << "TODO(crbug.com/1135372): fails on Apple DTK. Skipping.";
+      LOG(INFO) << "TODO(crbug.com/40151839): fails on Apple DTK. Skipping.";
       return;
     }
     if (gl_.gpu_preferences().use_passthrough_cmd_decoder) {
diff --git a/gpu/command_buffer/tests/gl_helper_unittest.cc b/gpu/command_buffer/tests/gl_helper_unittest.cc
index a233bb7..eb782ec 100644
--- a/gpu/command_buffer/tests/gl_helper_unittest.cc
+++ b/gpu/command_buffer/tests/gl_helper_unittest.cc
@@ -1295,7 +1295,7 @@
 
 // Per pixel tests, all sizes are small so that we can print
 // out the generated bitmaps.
-// TODO(crbug.com/1367486): Very flaky on Linux ASAN.
+// TODO(crbug.com/40867694): Very flaky on Linux ASAN.
 #if BUILDFLAG(IS_LINUX) && defined(ADDRESS_SANITIZER)
 #define MAYBE_ScaleTest DISABLED_ScaleTest
 #else
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
index eb21266..cbfe2c1b 100644
--- a/gpu/config/gpu_finch_features.cc
+++ b/gpu/config/gpu_finch_features.cc
@@ -626,7 +626,7 @@
 bool IsSkiaGraphiteSupportedByDevice(const base::CommandLine* command_line) {
 #if BUILDFLAG(IS_APPLE)
   // Graphite only works well with ANGLE Metal on Mac or iOS.
-  // TODO(crbug.com/1423574): Remove this after ANGLE Metal launches fully.
+  // TODO(crbug.com/40063538): Remove this after ANGLE Metal launches fully.
   const bool is_angle_metal_enabled =
       UsePassthroughCommandDecoder() &&
       (base::FeatureList::IsEnabled(features::kDefaultANGLEMetal) ||
@@ -811,7 +811,7 @@
 }
 
 bool IncreaseBufferCountForHighFrameRate() {
-  // TODO(crbug.com/1211332): We don't have a way to dynamically adjust number
+  // TODO(crbug.com/40767562): We don't have a way to dynamically adjust number
   // of buffers. So these checks, espeically the RAM one, is to limit the impact
   // of more buffers to devices that can handle them.
   // 8GB of ram with large margin for error.
diff --git a/gpu/config/gpu_info_collector_win.cc b/gpu/config/gpu_info_collector_win.cc
index 16ef7bb..a136ded 100644
--- a/gpu/config/gpu_info_collector_win.cc
+++ b/gpu/config/gpu_info_collector_win.cc
@@ -658,7 +658,7 @@
     return false;
 
   // The order of feature levels to attempt to create in D3D CreateDevice.
-  // TODO(crbug.com/1312519): Using 12_2 in kFeatureLevels[] will cause failure
+  // TODO(crbug.com/40831714): Using 12_2 in kFeatureLevels[] will cause failure
   // in D3D11CreateDevice(). Limit the highest feature to 12_1.
   const D3D_FEATURE_LEVEL kFeatureLevels[] = {
       D3D_FEATURE_LEVEL_12_1, D3D_FEATURE_LEVEL_12_0, D3D_FEATURE_LEVEL_11_1,
diff --git a/gpu/ipc/service/gles2_command_buffer_stub.cc b/gpu/ipc/service/gles2_command_buffer_stub.cc
index dd81fbec..0f057b5f 100644
--- a/gpu/ipc/service/gles2_command_buffer_stub.cc
+++ b/gpu/ipc/service/gles2_command_buffer_stub.cc
@@ -138,7 +138,7 @@
       channel_->sync_point_manager()->CreateSyncPointClientState(
           CommandBufferNamespace::GPU_IO, command_buffer_id_, sequence_id_);
 
-  // TODO(crbug.com/1251724): Remove this after testing.
+  // TODO(crbug.com/40198488): Remove this after testing.
   // Only enable multiple displays on ANGLE/Metal and only behind a feature.
   bool force_default_display = true;
   if (gl::GetGLImplementation() == gl::kGLImplementationEGLANGLE &&
diff --git a/gpu/ipc/service/gpu_channel_manager.cc b/gpu/ipc/service/gpu_channel_manager.cc
index 91af876..cf977c3 100644
--- a/gpu/ipc/service/gpu_channel_manager.cc
+++ b/gpu/ipc/service/gpu_channel_manager.cc
@@ -943,7 +943,7 @@
         gles2::GenerateGLContextAttribsForCompositor(use_passthrough_decoder);
 
     // Disable robust resource initialization for raster decoder and compositor.
-    // TODO(crbug.com/1192632): disable robust_resource_initialization for
+    // TODO(crbug.com/40174948): disable robust_resource_initialization for
     // SwANGLE.
     if (gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplayType() !=
         gl::ANGLE_SWIFTSHADER) {
diff --git a/gpu/ipc/service/gpu_channel_unittest.cc b/gpu/ipc/service/gpu_channel_unittest.cc
index f0337eb6..4074a55b 100644
--- a/gpu/ipc/service/gpu_channel_unittest.cc
+++ b/gpu/ipc/service/gpu_channel_unittest.cc
@@ -26,7 +26,7 @@
 const SurfaceHandle kFakeSurfaceHandle = 1;
 
 TEST_F(GpuChannelTest, CreateViewCommandBufferAllowed) {
-  // TODO(https://crbug.com/1406585): Currently it's not possible to create
+  // TODO(crbug.com/40062603): Currently it's not possible to create
   // onscreen GLSurface with Null binding with angle.
   if (channel_manager()->use_passthrough_cmd_decoder()) {
     GTEST_SKIP();
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc b/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc
index 3b78fca..58df3e9a 100644
--- a/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc
+++ b/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc
@@ -27,7 +27,7 @@
 }
 GpuMemoryBufferFactoryDXGI::~GpuMemoryBufferFactoryDXGI() = default;
 
-// TODO(crbug.com/1223490): Avoid the need for a separate D3D device here by
+// TODO(crbug.com/40774668): Avoid the need for a separate D3D device here by
 // sharing keyed mutex state between DXGI GMBs and D3D shared image backings.
 Microsoft::WRL::ComPtr<ID3D11Device>
 GpuMemoryBufferFactoryDXGI::GetOrCreateD3D11Device() {
diff --git a/gpu/ipc/service/gpu_watchdog_thread.cc b/gpu/ipc/service/gpu_watchdog_thread.cc
index 00203ee..fb7f513 100644
--- a/gpu/ipc/service/gpu_watchdog_thread.cc
+++ b/gpu/ipc/service/gpu_watchdog_thread.cc
@@ -732,7 +732,7 @@
   // Short term investigation into report only mode, bug tracking report only
   // mode can be found at crbug.com/1356196. The Catan team has not seen the
   // expected rampup in crashes where report only mode is enabled.
-  // TODO(crbug.com/1356196): remove this when investigation is over.
+  // TODO(crbug.com/40236187): remove this when investigation is over.
   UMA_HISTOGRAM_BOOLEAN("GPU.ReportOnlyModeStatusAtHang", in_report_only_mode_);
 
   // Create a crash dump first
diff --git a/headless/BUILD.gn b/headless/BUILD.gn
index 599f89bf..95e0075 100644
--- a/headless/BUILD.gn
+++ b/headless/BUILD.gn
@@ -636,7 +636,7 @@
     additional_manifest_fragments = [
       "//build/config/fuchsia/test/fonts.shard.test-cml",
 
-      # TODO(https://crbug.com/1185811): Investigate removing the requirement
+      # TODO(crbug.com/40055105): Investigate removing the requirement
       # for VmexResource.
       "//build/config/fuchsia/test/mark_vmo_executable.shard.test-cml",
       "//build/config/fuchsia/test/network.shard.test-cml",
diff --git a/headless/test/headless_devtools_client_browsertest.cc b/headless/test/headless_devtools_client_browsertest.cc
index f33a753..6055703 100644
--- a/headless/test/headless_devtools_client_browsertest.cc
+++ b/headless/test/headless_devtools_client_browsertest.cc
@@ -892,7 +892,7 @@
     std::unique_ptr<net::ProxyConfig> proxy_config(new net::ProxyConfig);
     proxy_config->proxy_rules().ParseFromString(
         proxy_server_.host_port_pair().ToString());
-    // TODO(https://crbug.com/901896): Don't rely on proxying localhost.
+    // TODO(crbug.com/40600992): Don't rely on proxying localhost.
     proxy_config->proxy_rules().bypass_rules.AddRulesToSubtractImplicit();
     builder.SetProxyConfig(std::move(proxy_config));
   }
diff --git a/infra/config/generated/testing/variants.pyl b/infra/config/generated/testing/variants.pyl
index 21e6467e..96a73d2 100644
--- a/infra/config/generated/testing/variants.pyl
+++ b/infra/config/generated/testing/variants.pyl
@@ -267,16 +267,16 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'identifier': 'Lacros version skew testing ash canary',
-    'description': 'Run with ash-chrome version 126.0.6428.0',
+    'description': 'Run with ash-chrome version 126.0.6429.0',
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome',
     ],
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v126.0.6428.0',
-          'revision': 'version:126.0.6428.0',
+          'location': 'lacros_version_skew_tests_v126.0.6429.0',
+          'revision': 'version:126.0.6429.0',
         },
       ],
     },
diff --git a/infra/config/gn_args/gn_args.star b/infra/config/gn_args/gn_args.star
index 493cb65b..3581ed4 100644
--- a/infra/config/gn_args/gn_args.star
+++ b/infra/config/gn_args/gn_args.star
@@ -500,7 +500,7 @@
     },
 )
 
-# TODO(https://crbug.com/1010584): Explicitly enable DirectX 12.
+# TODO(crbug.com/40101527): Explicitly enable DirectX 12.
 gn_args.config(
     name = "dx12vk",
     configs = [
diff --git a/infra/config/lib/try.star b/infra/config/lib/try.star
index a55c961..f699499f 100644
--- a/infra/config/lib/try.star
+++ b/infra/config/lib/try.star
@@ -236,7 +236,7 @@
     # TODO(crbug.com/1346781): Remove when the experiment is the default.
     experiments.setdefault("chromium_swarming.expose_merge_script_failures", 100)
 
-    # TODO(crbug.com/1466962): Remove when the experiment is the default.
+    # TODO(crbug.com/40276579): Remove when the experiment is the default.
     experiments.setdefault("swarming.prpc.cli", 100)
 
     merged_resultdb_bigquery_exports = [
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star b/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star
index ec3cd710..94862562 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star
@@ -85,7 +85,7 @@
         configs = [
             "release_try_builder",
             "reclient",
-            # TODO(crbug.com/1004523) Delete this once coverage mode is enabled
+            # TODO(crbug.com/40099061) Delete this once coverage mode is enabled
             # on the standard Windows trybot and the dedicated coverage trybot
             # is no longer needed.
             "no_resource_allowlisting",
diff --git a/infra/config/targets/compound_suites.star b/infra/config/targets/compound_suites.star
index a0fe602..dea0b86 100644
--- a/infra/config/targets/compound_suites.star
+++ b/infra/config/targets/compound_suites.star
@@ -859,7 +859,7 @@
     ],
 )
 
-# TODO(crbug.com/1080424): Merge with an existing set of tests such as
+# TODO(crbug.com/40130073): Merge with an existing set of tests such as
 # gpu_fyi_linux_release_gtests once all CrOS tests have been enabled.
 targets.legacy_compound_suite(
     name = "gpu_fyi_chromeos_release_gtests",
diff --git a/infra/config/targets/lacros-version-skew-variants.json b/infra/config/targets/lacros-version-skew-variants.json
index 26b1c86..52119ab 100644
--- a/infra/config/targets/lacros-version-skew-variants.json
+++ b/infra/config/targets/lacros-version-skew-variants.json
@@ -1,16 +1,16 @@
 {
   "LACROS_VERSION_SKEW_CANARY": {
     "args": [
-      "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome"
+      "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome"
     ],
-    "description": "Run with ash-chrome version 126.0.6428.0",
+    "description": "Run with ash-chrome version 126.0.6429.0",
     "identifier": "Lacros version skew testing ash canary",
     "swarming": {
       "cipd_packages": [
         {
           "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-          "location": "lacros_version_skew_tests_v126.0.6428.0",
-          "revision": "version:126.0.6428.0"
+          "location": "lacros_version_skew_tests_v126.0.6429.0",
+          "revision": "version:126.0.6429.0"
         }
       ]
     }
diff --git a/ios/build/bots/scripts/variations_runner.py b/ios/build/bots/scripts/variations_runner.py
index 8fb0c39..d4ac23d 100644
--- a/ios/build/bots/scripts/variations_runner.py
+++ b/ios/build/bots/scripts/variations_runner.py
@@ -166,9 +166,9 @@
     # Verify seed has been updated successfully and it's different from the
     # injected test seed.
     #
-    # TODO(crbug.com/1234171): This test expectation may not work correctly when
-    # a field trial config under test does not affect a platform, so it requires
-    # more investigations to figure out the correct behavior.
+    # TODO(crbug.com/40191854): This test expectation may not work correctly
+    # when a field trial config under test does not affect a platform, so it
+    # requires more investigations to figure out the correct behavior.
     current_seed, current_signature = seed_helper.get_current_seed(
         self._user_data_dir())
     if current_seed == seed or current_signature == signature:
diff --git a/ios/chrome/app/startup/setup_debugging.mm b/ios/chrome/app/startup/setup_debugging.mm
index 8599227b..b06f5896 100644
--- a/ios/chrome/app/startup/setup_debugging.mm
+++ b/ios/chrome/app/startup/setup_debugging.mm
@@ -163,7 +163,7 @@
 
 + (void)setUpDebuggingOptions {
 // Enable the zombie treadmill on simulator builds.
-// TODO(crbug.com/663390): Consider enabling this on device builds too.
+// TODO(crbug.com/40492640): Consider enabling this on device builds too.
 #if TARGET_IPHONE_SIMULATOR
   DCHECK(ObjcEvilDoers::ZombieEnable(true, 10000));
 #endif
diff --git a/ios/chrome/browser/history/model/history_tab_helper.mm b/ios/chrome/browser/history/model/history_tab_helper.mm
index 8fba075..74db5355 100644
--- a/ios/chrome/browser/history/model/history_tab_helper.mm
+++ b/ios/chrome/browser/history/model/history_tab_helper.mm
@@ -155,7 +155,7 @@
       /*did_replace_entry=*/false, consider_for_ntp_most_visited,
       navigation_context->IsSameDocument() ? GetPageTitle(*last_committed_item)
                                            : std::nullopt,
-      // TODO(crbug.com/1475717): due to WebKit constraints, iOS does not
+      // TODO(crbug.com/40279742): due to WebKit constraints, iOS does not
       // support triple-key partitioning. Once supported, we need to populate
       // `top_level_url` with the correct value. Until then, :visited history on
       // iOS is unpartitioned.
diff --git a/ios/chrome/browser/main/model/browser_util.mm b/ios/chrome/browser/main/model/browser_util.mm
index fdd885b..8f8ce13 100644
--- a/ios/chrome/browser/main/model/browser_util.mm
+++ b/ios/chrome/browser/main/model/browser_util.mm
@@ -55,7 +55,7 @@
   MoveSnapshot(snapshot_tab_helper->GetSnapshotID(), source_browser,
                destination_browser);
 
-  // TODO(crbug.com/1264451): Remove this workaround when it will no longer be
+  // TODO(crbug.com/40203375): Remove this workaround when it will no longer be
   // required to have an active WebState in the WebStateList.
   if (destination_browser->GetWebStateList()->empty()) {
     params.Activate();
diff --git a/ios/chrome/browser/policy/model/policy_watcher_browser_agent.mm b/ios/chrome/browser/policy/model/policy_watcher_browser_agent.mm
index 139b7063..e11a6652 100644
--- a/ios/chrome/browser/policy/model/policy_watcher_browser_agent.mm
+++ b/ios/chrome/browser/policy/model/policy_watcher_browser_agent.mm
@@ -154,7 +154,7 @@
 void PolicyWatcherBrowserAgent::UpdateAppContainerBackupExclusion() {
   bool backup_allowed = browser_->GetBrowserState()->GetPrefs()->GetBoolean(
       prefs::kAllowChromeDataInBackups);
-  // TODO(crbug.com/1303652): If multiple profiles are supported on iOS, update
+  // TODO(crbug.com/40826035): If multiple profiles are supported on iOS, update
   // this logic to work with multiple profiles having possibly-possibly
   // conflicting preference values.
   base::FilePath storage_dir = base::apple::GetUserLibraryPath();
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
index f9c569b..a4348be6 100644
--- a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
+++ b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
@@ -387,7 +387,7 @@
 // inconsistencies. Those two boolean indicate if one of those commands have
 // been processed in the last 200ms in order to only allow processing one at
 // a time.
-// TODO(crbug.com/560296):  Provide a general solution for handling mutually
+// TODO(crbug.com/40445992):  Provide a general solution for handling mutually
 // exclusive chrome commands sent at nearly the same time.
 @property(nonatomic, assign) BOOL isProcessingTabSwitcherCommand;
 @property(nonatomic, assign) BOOL isProcessingVoiceSearchCommand;
diff --git a/ios/chrome/browser/signin/model/authentication_service_observer.h b/ios/chrome/browser/signin/model/authentication_service_observer.h
index e461e7f..2f33c6c 100644
--- a/ios/chrome/browser/signin/model/authentication_service_observer.h
+++ b/ios/chrome/browser/signin/model/authentication_service_observer.h
@@ -22,7 +22,7 @@
 
   // Called when the AuthenticationService::GetPrimaryIdentity() value changes.
   // This method might be called with no changes.
-  // TODO(crbug.com/1376908): DEPRECATED: This method should be removed once
+  // TODO(crbug.com/40243387): DEPRECATED: This method should be removed once
   // FakeAuthenticationService is remove. Use IdentityManager notifications.
   virtual void OnPrimaryIdentityChanged() {}
 };
diff --git a/ios/chrome/browser/signin/model/signin_browser_state_info_updater.mm b/ios/chrome/browser/signin/model/signin_browser_state_info_updater.mm
index 3e451fe..e95f86b 100644
--- a/ios/chrome/browser/signin/model/signin_browser_state_info_updater.mm
+++ b/ios/chrome/browser/signin/model/signin_browser_state_info_updater.mm
@@ -28,7 +28,7 @@
   signin_error_controller_observation_.Observe(signin_error_controller);
 
   UpdateBrowserStateInfo();
-  // TODO(crbug.com/908457): Call OnErrorChanged() here, to catch any change
+  // TODO(crbug.com/40603806): Call OnErrorChanged() here, to catch any change
   // that happened since the construction of SigninErrorController. BrowserState
   // metrics depend on this bug and must be fixed first.
 }
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h
index fbe1d41b..d9d1a539 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h
@@ -26,7 +26,7 @@
   SigninPromoViewStyleCompactHorizontal = 1,
   SigninPromoViewStyleCompactVertical = 2,
   // Style containing a single rounded corners colored button.
-  // TODO(crbug.com/1467810): This is a weird construct used only by recent
+  // TODO(crbug.com/40924554): This is a weird construct used only by recent
   // tabs, where SigninPromoView shows the button and other views show the
   // text/illustration. We should consider adopting SigninPromoViewStyleStandard
   // in that UI, or bringing the text/illustration here.
diff --git a/ios/chrome/browser/ui/authentication/signin/logging/upgrade_signin_logger.mm b/ios/chrome/browser/ui/authentication/signin/logging/upgrade_signin_logger.mm
index d202952..2fc6d706 100644
--- a/ios/chrome/browser/ui/authentication/signin/logging/upgrade_signin_logger.mm
+++ b/ios/chrome/browser/ui/authentication/signin/logging/upgrade_signin_logger.mm
@@ -63,7 +63,7 @@
     }
     case SigninCoordinatorResultDisabled:
     case SigninCoordinatorResultInterrupted: {
-      // TODO(crbug.com/951145): Add metric for when the sign-in has been
+      // TODO(crbug.com/40622384): Add metric for when the sign-in has been
       // interrupted.
       break;
     }
diff --git a/ios/chrome/browser/ui/broadcaster/chrome_broadcaster.mm b/ios/chrome/browser/ui/broadcaster/chrome_broadcaster.mm
index 00fa83ec..45b95e1 100644
--- a/ios/chrome/browser/ui/broadcaster/chrome_broadcaster.mm
+++ b/ios/chrome/browser/ui/broadcaster/chrome_broadcaster.mm
@@ -189,7 +189,7 @@
   // Sanity check: `selector` must not already be broadcast.
   DCHECK(!self.items[name]);
 
-  // TODO(crbug.com/719911) -- Another sanity check is needed here -- verify
+  // TODO(crbug.com/40519578) -- Another sanity check is needed here -- verify
   // that the value to be observed is of the type that `selector` expects.
 
   self.items[name] =
diff --git a/ios/chrome/browser/ui/default_promo/default_browser_instructions_view.mm b/ios/chrome/browser/ui/default_promo/default_browser_instructions_view.mm
index 6844898..71d9d072 100644
--- a/ios/chrome/browser/ui/default_promo/default_browser_instructions_view.mm
+++ b/ios/chrome/browser/ui/default_promo/default_browser_instructions_view.mm
@@ -85,7 +85,7 @@
   NSString* animationAssetName;
   NSString* animationAssetNameDarkMode;
 
-  // TODO(crbug.com/1508131): Handle the case when the promo is displayed and
+  // TODO(crbug.com/40948842): Handle the case when the promo is displayed and
   // the user switches between LTR and RLT.
   if (base::i18n::IsRTL()) {
     animationAssetName = kDefaultBrowserAnimationRtl;
diff --git a/ios/chrome/browser/ui/orchestrator/omnibox_focus_orchestrator.mm b/ios/chrome/browser/ui/orchestrator/omnibox_focus_orchestrator.mm
index 03a33ec..1b143b3d 100644
--- a/ios/chrome/browser/ui/orchestrator/omnibox_focus_orchestrator.mm
+++ b/ios/chrome/browser/ui/orchestrator/omnibox_focus_orchestrator.mm
@@ -297,7 +297,7 @@
           [UIView addKeyframeWithRelativeStartTime:0
                                   relativeDuration:1
                                         animations:^{
-                                          [self expansion:animated];
+                                          [self expansion];
                                         }];
           [UIView
               addKeyframeWithRelativeStartTime:0
@@ -312,7 +312,7 @@
         }];
 
   } else {
-    [self expansion:animated];
+    [self expansion];
     [self.toolbarAnimatee hideControlButtons];
   }
 }
@@ -333,7 +333,7 @@
           [UIView addKeyframeWithRelativeStartTime:0
                                   relativeDuration:relativeDurationAnimation1
                                         animations:^{
-                                          [self contraction:animated];
+                                          [self contraction];
                                         }];
           [UIView
               addKeyframeWithRelativeStartTime:relativeDurationAnimation1
@@ -347,7 +347,7 @@
           [self animationFinished];
         }];
   } else {
-    [self contraction:animated];
+    [self contraction];
     [self.toolbarAnimatee showControlButtons];
     [self.toolbarAnimatee hideCancelButton];
   }
@@ -392,8 +392,8 @@
 #pragma mark - Private animation helpers
 
 // Visually expands the location bar for focus.
-- (void)expansion:(BOOL)animated {
-  [self.toolbarAnimatee expandLocationBar:animated];
+- (void)expansion {
+  [self.toolbarAnimatee expandLocationBar];
   [self.toolbarAnimatee showCancelButton];
   switch (_trigger) {
     case OmniboxFocusTrigger::kPinnedLargeFakebox:
@@ -408,8 +408,8 @@
 }
 
 // Visually contracts the location bar for defocus.
-- (void)contraction:(BOOL)animated {
-  [self.toolbarAnimatee contractLocationBar:animated];
+- (void)contraction {
+  [self.toolbarAnimatee contractLocationBar];
   if (_trigger == OmniboxFocusTrigger::kPinnedLargeFakebox) {
     [self.toolbarAnimatee setLocationBarHeightToMatchFakeOmnibox];
   }
diff --git a/ios/chrome/browser/ui/orchestrator/toolbar_animatee.h b/ios/chrome/browser/ui/orchestrator/toolbar_animatee.h
index 555e6da..97cddc6 100644
--- a/ios/chrome/browser/ui/orchestrator/toolbar_animatee.h
+++ b/ios/chrome/browser/ui/orchestrator/toolbar_animatee.h
@@ -10,8 +10,8 @@
 @protocol ToolbarAnimatee<NSObject>
 
 // Changes related to the Location Bar container.
-- (void)expandLocationBar:(BOOL)animated;
-- (void)contractLocationBar:(BOOL)animated;
+- (void)expandLocationBar;
+- (void)contractLocationBar;
 
 // Changes related to the cancel button.
 - (void)showCancelButton;
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
index 9e9f51330..f98a0ef 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -55,7 +55,7 @@
     TableViewLinkHeaderFooterItemDelegate,
     UIGestureRecognizerDelegate>
 
-// TODO(crbug.com/850699): remove direct dependency and replace with
+// TODO(crbug.com/40579855): remove direct dependency and replace with
 // delegate.
 @property(nonatomic, readonly, strong) ClearBrowsingDataManager* dataManager;
 
@@ -591,7 +591,7 @@
 
 // Offer the user to sign-out near itemView
 // If they sync, they can keep or delete their data.
-// TODO(crbug.com/1385791) Test that correct histogram is registered.
+// TODO(crbug.com/40879413) Test that correct histogram is registered.
 - (void)showSignOutWithItemView:(UIView*)itemView {
   if (_signoutCoordinator) {
     // An action is already in progress, ignore user's request.
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
index dd40a25..27a92d4c 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
@@ -128,7 +128,7 @@
 @property(nonatomic, strong, readonly)
     PrefBackedBoolean* allowChromeSigninPreference;
 // Preference value for the "Help improve Chromium's features" for Wifi-Only.
-// TODO(crbug.com/872101): Needs to create the UI to change from Wifi-Only to
+// TODO(crbug.com/40588486): Needs to create the UI to change from Wifi-Only to
 // always
 @property(nonatomic, strong, readonly)
     PrefBackedBoolean* sendDataUsageWifiOnlyPreference;
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
index 0fe2bba..f7ab0aa 100644
--- a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
+++ b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
@@ -1624,7 +1624,7 @@
 // TODO(crbug.com/1442985): This test is flaky.
 - (void)FLAKY_testManyPasswords {
   if ([ChromeEarlGrey isIPadIdiom]) {
-    // TODO(crbug.com/906551): Enable the test on iPad once the bug is fixed.
+    // TODO(crbug.com/40602996): Enable the test on iPad once the bug is fixed.
     EARL_GREY_TEST_DISABLED(@"Disabled for iPad.");
   }
 
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
index 22d3128..63298d82 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -255,7 +255,7 @@
   StringPrefMember _voiceLocaleCode;
   // Pref observer to track changes to prefs.
   std::unique_ptr<PrefObserverBridge> _prefObserverBridge;
-  // TODO(crbug.com/662435): Refactor PrefObserverBridge so it owns the
+  // TODO(crbug.com/40492152): Refactor PrefObserverBridge so it owns the
   // PrefChangeRegistrar.
   // Registrar for pref changes notifications.
   PrefChangeRegistrar _prefChangeRegistrar;
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
index caeee23..da00fa7c 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
@@ -483,7 +483,7 @@
 
 // Verifies that the back/forward buttons are working and are correctly enabled
 // during navigations.
-// TODO(crbug.com/1488801): Test is failing on downstream bots.
+// TODO(crbug.com/40073965): Test is failing on downstream bots.
 - (void)DISABLED_testNavigationButtons {
   // Setup the server.
   self.testServer->RegisterRequestHandler(
diff --git a/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm
index e2b4593..ce98225 100644
--- a/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm
@@ -226,25 +226,13 @@
 
 #pragma mark - ToolbarAnimatee
 
-- (void)expandLocationBar:(BOOL)animated {
+- (void)expandLocationBar {
   [self deactivateViewLocationBarConstraints];
   [NSLayoutConstraint activateConstraints:self.view.expandedConstraints];
-  if (base::FeatureList::IsEnabled(kEnableStartupImprovements)) {
-    // No need to force the view to layout immediately when no animation is
-    // required, the pending layout updates can be calculated and rendered in
-    // the next runloop. Otherwise, this unnecessary layout will affect startup
-    // performance. And it is necessary to force the view to update its layout
-    // when it's animated. This is because there are following animations that
-    // need the final frame of the location bar.
-    if (animated) {
-      [self.view layoutIfNeeded];
-    }
-  } else {
-    [self.view layoutIfNeeded];
-  }
+  [self.view layoutIfNeeded];
 }
 
-- (void)contractLocationBar:(BOOL)animated {
+- (void)contractLocationBar {
   [self deactivateViewLocationBarConstraints];
   if (IsSplitToolbarMode(self)) {
     [NSLayoutConstraint
@@ -252,19 +240,7 @@
   } else {
     [NSLayoutConstraint activateConstraints:self.view.contractedConstraints];
   }
-  if (base::FeatureList::IsEnabled(kEnableStartupImprovements)) {
-    // No need to force the view to layout immediately when no animation is
-    // required, the pending layout updates can be calculated and rendered in
-    // the next runloop. Otherwise, this unnecessary layout will affect startup
-    // performance. And it is necessary to force the view to update its layout
-    // when it's animated. This is because there are following animations that
-    // need the final frame of the location bar.
-    if (animated) {
-      [self.view layoutIfNeeded];
-    }
-  } else {
-    [self.view layoutIfNeeded];
-  }
+  [self.view layoutIfNeeded];
 }
 
 - (void)showCancelButton {
diff --git a/ios/chrome/browser/variations/model/DEPS b/ios/chrome/browser/variations/model/DEPS
index bd0bde3..6beb3aa 100644
--- a/ios/chrome/browser/variations/model/DEPS
+++ b/ios/chrome/browser/variations/model/DEPS
@@ -1,6 +1,6 @@
 include_rules = [
   # To access IOSChromeMetricsServiceAccessor.
-  # TODO(crbug.com/1508150): Remove this entry once the limited entropy
+  # TODO(crbug.com/40948861): Remove this entry once the limited entropy
   # synthetic trial has been wrapped up.
   "+ios/chrome/browser/metrics/model",
 ]
diff --git a/ios/chrome/browser/web/model/ios_thread_profiler.h b/ios/chrome/browser/web/model/ios_thread_profiler.h
index 68f5586..f5194d6 100644
--- a/ios/chrome/browser/web/model/ios_thread_profiler.h
+++ b/ios/chrome/browser/web/model/ios_thread_profiler.h
@@ -4,7 +4,7 @@
 
 // Adapted from chrome/common/profiler/thread_profiler.h
 
-// TODO(crbug.com/1229530): remove this once //chrome/common/profiler is moved
+// TODO(crbug.com/40778431): remove this once //chrome/common/profiler is moved
 // to components/profiler.
 
 #ifndef IOS_CHROME_BROWSER_WEB_MODEL_IOS_THREAD_PROFILER_H_
diff --git a/ios/chrome/test/earl_grey/chrome_test_case.mm b/ios/chrome/test/earl_grey/chrome_test_case.mm
index edc7f288..f50f805d 100644
--- a/ios/chrome/test/earl_grey/chrome_test_case.mm
+++ b/ios/chrome/test/earl_grey/chrome_test_case.mm
@@ -54,7 +54,7 @@
     @"testContextMenuOpenInNewTab",     // ContextMenuTestCase
     @"testContextMenuOpenInNewWindow",  // ContextMenuTestCase
     @"testSwitchToMain",                // CookiesTestCase
-    // TODO(crbug.com/1422238) Re-enable this flaky test on multitasking.
+    // TODO(crbug.com/40896793) Re-enable this flaky test on multitasking.
     // @"testSwitchToIncognito",              // CookiesTestCase
     @"testFindDefaultFormAssistControls",  // FormInputTestCase
     @"testTabDeletion",                    // TabUsageRecorderTestCase
diff --git a/ios/components/io_thread/ios_io_thread.mm b/ios/components/io_thread/ios_io_thread.mm
index e8e7f3c..279dbd8 100644
--- a/ios/components/io_thread/ios_io_thread.mm
+++ b/ios/components/io_thread/ios_io_thread.mm
@@ -81,7 +81,7 @@
     net::NetLog* net_log) {
   TRACE_EVENT0("startup", "IOSIOThread::CreateGlobalHostResolver");
 
-  // TODO(crbug.com/934402): Use a shared HostResolverManager instead of a
+  // TODO(crbug.com/40614970): Use a shared HostResolverManager instead of a
   // single global HostResolver for iOS.
   std::unique_ptr<net::HostResolver> global_host_resolver =
       net::HostResolver::CreateStandaloneResolver(net_log);
diff --git a/ios/net/cookies/cookie_store_ios.mm b/ios/net/cookies/cookie_store_ios.mm
index 785238a..05e18f3 100644
--- a/ios/net/cookies/cookie_store_ios.mm
+++ b/ios/net/cookies/cookie_store_ios.mm
@@ -280,7 +280,7 @@
   // instead.
   DCHECK(SystemCookiesAllowed());
 
-  // TODO(crbug.com/1225444): Include cookie partition key when/if iOS supports
+  // TODO(crbug.com/40188414): Include cookie partition key when/if iOS supports
   // it.
 
   // TODO(mkwst): If/when iOS supports Same-Site cookies, we'll need to pass
diff --git a/ios/net/cookies/system_cookie_store.h b/ios/net/cookies/system_cookie_store.h
index caad2c3..9df3e88 100644
--- a/ios/net/cookies/system_cookie_store.h
+++ b/ios/net/cookies/system_cookie_store.h
@@ -83,7 +83,7 @@
   // Internal cookie stores doesn't store creation time. This object is used
   // to keep track of the creation time of cookies, this is required for
   // conversion between SystemCookie and Chromium CookieMonster.
-  // TODO(crbug.com/825227): Move this to be private.
+  // TODO(crbug.com/40568476): Move this to be private.
   std::unique_ptr<CookieCreationTimeManager> creation_time_manager_;
 
  private:
diff --git a/ios/web/init/web_main_loop.mm b/ios/web/init/web_main_loop.mm
index 64e9902e..b38aa2c6 100644
--- a/ios/web/init/web_main_loop.mm
+++ b/ios/web/init/web_main_loop.mm
@@ -111,7 +111,7 @@
     parts_->PreCreateThreads();
   }
 
-  // TODO(crbug.com/807279): Do we need PowerMonitor on iOS, or can we get rid
+  // TODO(crbug.com/40560534): Do we need PowerMonitor on iOS, or can we get rid
   // of it?
   // TODO(crbug.com/1370276): Remove this once we have confidence PowerMonitor
   // is not needed for iOS
diff --git a/ios/web/net/cookies/crw_wk_http_cookie_store.h b/ios/web/net/cookies/crw_wk_http_cookie_store.h
index 6d6ba18..700718e 100644
--- a/ios/web/net/cookies/crw_wk_http_cookie_store.h
+++ b/ios/web/net/cookies/crw_wk_http_cookie_store.h
@@ -24,8 +24,8 @@
 
 // Fetches all stored cookies. If the store didn't change between calls, this
 // method will return the cached result of the last call.
-// TODO(crbug.com/946171): Remove caching when WKHTTPCookieStore performance bug
-// is fixed.
+// TODO(crbug.com/40620220): Remove caching when WKHTTPCookieStore performance
+// bug is fixed.
 - (void)getAllCookies:(void (^)(NSArray<NSHTTPCookie*>*))completionHandler;
 
 // Sets `cookie` to the store, and invokes `completionHandler` after cookie is
diff --git a/ios/web/public/test/web_view_interaction_test_util.mm b/ios/web/public/test/web_view_interaction_test_util.mm
index 3740c81..a2d3db8 100644
--- a/ios/web/public/test/web_view_interaction_test_util.mm
+++ b/ios/web/public/test/web_view_interaction_test_util.mm
@@ -149,7 +149,7 @@
 CGRect GetBoundingRectOfElement(web::WebState* web_state,
                                 ElementSelector* selector) {
 #if !TARGET_IPHONE_SIMULATOR
-  // TODO(crbug.com/1013714): Replace delay with improved JavaScript.
+  // TODO(crbug.com/40652803): Replace delay with improved JavaScript.
   // As of iOS 13.1, devices need additional time to stabalize the page before
   // getting the element location. Without this wait, the element's bounding
   // rect will be incorrect.
diff --git a/ios/web_view/public/cwv_trusted_vault_utils.h b/ios/web_view/public/cwv_trusted_vault_utils.h
index 705d345..8407777 100644
--- a/ios/web_view/public/cwv_trusted_vault_utils.h
+++ b/ios/web_view/public/cwv_trusted_vault_utils.h
@@ -14,7 +14,7 @@
 // Possible states of the trusted vault. Keep in sync with
 // syncer::TrustedVaultDeviceRegistrationStateForUMA.
 typedef NS_ENUM(NSInteger, CWVTrustedVaultState) {
-  // TODO(crbug.com/1362716): DEPRECATED, use
+  // TODO(crbug.com/40238423): DEPRECATED, use
   // `CWVTrustedVaultStateAlreadyRegisteredV0`.
   CWVTrustedVaultStateAlreadyRegistered = 0,
   CWVTrustedVaultStateAlreadyRegisteredV0 = 0,
diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc
index bddc2f6..fde5dee 100644
--- a/media/base/android/media_drm_bridge.cc
+++ b/media/base/android/media_drm_bridge.cc
@@ -844,7 +844,7 @@
   DVLOG(2) << __func__;
   std::string session_id;
   JavaByteArrayToString(env, j_session_id, &session_id);
-  // TODO(crbug.com/1208618): Support other closed reasons.
+  // TODO(crbug.com/40181810): Support other closed reasons.
   task_runner_->PostTask(
       FROM_HERE, base::BindOnce(session_closed_cb_, std::move(session_id),
                                 CdmSessionClosedReason::kClose));
diff --git a/media/base/key_system_info.h b/media/base/key_system_info.h
index 5575ca7d..e8601cf 100644
--- a/media/base/key_system_info.h
+++ b/media/base/key_system_info.h
@@ -70,7 +70,7 @@
   // requirement, which is enforced by `KeySystemConfigSelector`. Therefore, the
   // returned `EmeConfig` doesn't need to specify persistence requirement
   // explicitly.
-  // TODO(crbug.com/1324262): Refactor `EmeConfig` to make it easier to
+  // TODO(crbug.com/40839176): Refactor `EmeConfig` to make it easier to
   // express combinations of requirements.
   virtual EmeConfig::Rule GetPersistentLicenseSessionSupport() const = 0;
 
diff --git a/media/base/key_systems_impl.h b/media/base/key_systems_impl.h
index ee43a73..dc0081c 100644
--- a/media/base/key_systems_impl.h
+++ b/media/base/key_systems_impl.h
@@ -95,7 +95,7 @@
   bool IsValidMimeTypeCodecsCombination(const std::string& mime_type,
                                         SupportedCodecs codecs) const;
 
-  // TODO(crbug.com/417440): Separate container enum from codec mask value.
+  // TODO(crbug.com/40386158): Separate container enum from codec mask value.
   // Potentially pass EmeMediaType and a container enum.
   SupportedCodecs GetCodecMaskForMimeType(
       const std::string& container_mime_type) const;
diff --git a/media/base/key_systems_unittest.cc b/media/base/key_systems_unittest.cc
index 09de6be..a56472f9 100644
--- a/media/base/key_systems_unittest.cc
+++ b/media/base/key_systems_unittest.cc
@@ -44,7 +44,7 @@
 
 // Codecs only supported in FOO container. Pick some arbitrary bit fields as
 // long as they are not in conflict with the real ones (static_asserted below).
-// TODO(crbug.com/724362): Remove container type (FOO) from codec enums.
+// TODO(crbug.com/40521627): Remove container type (FOO) from codec enums.
 enum TestCodec : uint32_t {
   TEST_CODEC_FOO_AUDIO = 1 << 25,
   TEST_CODEC_FOO_AUDIO_ALL = TEST_CODEC_FOO_AUDIO,
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 37a5010f..d42255f 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -1688,7 +1688,7 @@
 
 // Controls whether system loopback audio can be Cast to audio-only Cast
 // receivers, e.g. speakers.
-// TODO(crbug.com/849335): Remove once launched.
+// TODO(crbug.com/40579200): Remove once launched.
 BASE_FEATURE(kCastLoopbackAudioToAudioReceivers,
              "CastLoopbackAudioToAudioReceivers",
              base::FEATURE_ENABLED_BY_DEFAULT);
@@ -1697,7 +1697,7 @@
 // encoding.
 //
 // NOTE: currently only software AV1 encoding is supported.
-// TODO(https://crbug.com/1383333): hardware AV1 encoding should be added.
+// TODO(crbug.com/40246079): hardware AV1 encoding should be added.
 BASE_FEATURE(kCastStreamingAv1,
              "CastStreamingAv1",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/media/base/renderer_client.h b/media/base/renderer_client.h
index 38cf1ac..80986fb2 100644
--- a/media/base/renderer_client.h
+++ b/media/base/renderer_client.h
@@ -58,7 +58,7 @@
   virtual void OnVideoOpacityChange(bool opaque) = 0;
 
   // Returns true if video stream is available in the media resource.
-  // TODO(crbug.com/988535): Used by AudioRendererImpl.  This can be removed
+  // TODO(crbug.com/40638012): Used by AudioRendererImpl.  This can be removed
   // when the bug is resolved.
   virtual bool IsVideoStreamAvailable();
 
diff --git a/media/base/video_frame_metadata.h b/media/base/video_frame_metadata.h
index 601075b..2633fcb 100644
--- a/media/base/video_frame_metadata.h
+++ b/media/base/video_frame_metadata.h
@@ -179,7 +179,7 @@
 
   // CompositorFrameMetadata variables associated with this frame. Used for
   // remote debugging.
-  // TODO(crbug.com/832220): Use a customized dictionary value instead of
+  // TODO(crbug.com/40571471): Use a customized dictionary value instead of
   // using these keys directly.
   std::optional<double> device_scale_factor;
   std::optional<double> page_scale_factor;
diff --git a/media/base/video_util.cc b/media/base/video_util.cc
index c89ca3d..a765255 100644
--- a/media/base/video_util.cc
+++ b/media/base/video_util.cc
@@ -855,7 +855,7 @@
     case kBGRA_8888_SkColorType:
       return is_opaque ? PIXEL_FORMAT_XRGB : PIXEL_FORMAT_ARGB;
     default:
-      // TODO(crbug.com/1073995): Add F16 support.
+      // TODO(crbug.com/40686604): Add F16 support.
       return PIXEL_FORMAT_UNKNOWN;
   }
 }
@@ -890,7 +890,7 @@
 
   auto frame = VideoFrame::WrapExternalDataWithLayout(
       *layout, visible_rect, natural_size,
-      // TODO(crbug.com/1161304): We should be able to wrap readonly memory in
+      // TODO(crbug.com/40162403): We should be able to wrap readonly memory in
       // a VideoFrame instead of using writable_addr() here.
       reinterpret_cast<uint8_t*>(pm.writable_addr()), pm.computeByteSize(),
       timestamp);
diff --git a/media/cast/cast_config.h b/media/cast/cast_config.h
index 742f9252..c3d5f63f 100644
--- a/media/cast/cast_config.h
+++ b/media/cast/cast_config.h
@@ -23,7 +23,7 @@
 
 namespace cast {
 
-// TODO(https://crbug.com/1363514): should be removed in favor of
+// TODO(crbug.com/40238715): should be removed in favor of
 // media::VideoCodec, media::AudioCodec.
 enum class Codec {
   kUnknown,
@@ -187,7 +187,7 @@
   //
   // All three delays are set to the same value due to adaptive latency
   // being disabled in Chrome.
-  // TODO(https://crbug.com/1363017): re-enable adaptive playout dleay.
+  // TODO(crbug.com/40238532): re-enable adaptive playout dleay.
   base::TimeDelta min_playout_delay = kDefaultTargetPlayoutDelay;
   base::TimeDelta max_playout_delay = kDefaultTargetPlayoutDelay;
 
diff --git a/media/cast/encoding/encoding_support.cc b/media/cast/encoding/encoding_support.cc
index 598bc395..49cea726 100644
--- a/media/cast/encoding/encoding_support.cc
+++ b/media/cast/encoding/encoding_support.cc
@@ -68,7 +68,7 @@
     return false;
   }
 
-  // TODO(crbug.com/1015482): the hardware encoder is broken on Windows.
+  // TODO(crbug.com/40653760): the hardware encoder is broken on Windows.
   const bool is_enabled_on_platform =
 #if BUILDFLAG(IS_MAC)
       base::FeatureList::IsEnabled(kCastStreamingMacHardwareH264);
diff --git a/media/cdm/aes_decryptor.cc b/media/cdm/aes_decryptor.cc
index 0ae439b..002e4086 100644
--- a/media/cdm/aes_decryptor.cc
+++ b/media/cdm/aes_decryptor.cc
@@ -410,7 +410,7 @@
   if (it->second == CdmSessionType::kPersistentLicense) {
     // The license release message is specified in the spec:
     // https://w3c.github.io/encrypted-media/#clear-key-release-format.
-    // TODO(crbug.com/1107614) Move session message for persistent-license
+    // TODO(crbug.com/40706999) Move session message for persistent-license
     // session from AesDecryptor to ClearKeyPersistentSessionCdm.
     KeyIdList key_ids;
     key_ids.reserve(keys_info.size());
diff --git a/media/cdm/cdm_type_conversion.cc b/media/cdm/cdm_type_conversion.cc
index f9320fa..357e8aa 100644
--- a/media/cdm/cdm_type_conversion.cc
+++ b/media/cdm/cdm_type_conversion.cc
@@ -119,8 +119,8 @@
       return CdmSessionType::kTemporary;
     case cdm::kPersistentLicense:
       return CdmSessionType::kPersistentLicense;
-    // TODO(crbug.com/1181029): Remove after `kPersistentUsageRecord` is removed
-    // from the CDM interface.
+    // TODO(crbug.com/40170205): Remove after `kPersistentUsageRecord` is
+    // removed from the CDM interface.
     case cdm::kPersistentUsageRecord:
       break;
   }
diff --git a/media/cdm/cenc_decryptor.cc b/media/cdm/cenc_decryptor.cc
index b4df464..8984890 100644
--- a/media/cdm/cenc_decryptor.cc
+++ b/media/cdm/cenc_decryptor.cc
@@ -48,7 +48,7 @@
   }
 }
 
-// TODO(crbug.com/840983): This should be done in DecoderBuffer so that
+// TODO(crbug.com/40575437): This should be done in DecoderBuffer so that
 // additional fields are more easily handled.
 void CopyExtraSettings(const DecoderBuffer& input, DecoderBuffer* output) {
   output->set_timestamp(input.timestamp());
diff --git a/media/cdm/library_cdm/clear_key_cdm/BUILD.gn b/media/cdm/library_cdm/clear_key_cdm/BUILD.gn
index d8e186e4..68c163b 100644
--- a/media/cdm/library_cdm/clear_key_cdm/BUILD.gn
+++ b/media/cdm/library_cdm/clear_key_cdm/BUILD.gn
@@ -38,7 +38,7 @@
     "//url",
   ]
 
-  # TODO(crbug.com/169203): Convert this to use media::FFmpegAudioDecoder.
+  # TODO(crbug.com/40298390): Convert this to use media::FFmpegAudioDecoder.
   if (media_use_ffmpeg) {
     sources += [
       "ffmpeg_cdm_audio_decoder.cc",
diff --git a/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc b/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc
index 4d08882..550b6e61 100644
--- a/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc
+++ b/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc
@@ -104,7 +104,7 @@
   cdm_video_frame->SetSize(
       {video_frame.coded_size().width(), video_frame.coded_size().height()});
   cdm_video_frame->SetTimestamp(video_frame.timestamp().InMicroseconds());
-  // TODO(crbug.com/707127): Set ColorSpace here. It's not trivial to convert
+  // TODO(crbug.com/40513452): Set ColorSpace here. It's not trivial to convert
   // a gfx::ColorSpace (from VideoFrame) to another other ColorSpace like
   // cdm::ColorSpace.
 
diff --git a/media/cdm/win/media_foundation_cdm.cc b/media/cdm/win/media_foundation_cdm.cc
index 7573006..ad4d2b4 100644
--- a/media/cdm/win/media_foundation_cdm.cc
+++ b/media/cdm/win/media_foundation_cdm.cc
@@ -517,7 +517,7 @@
     std::unique_ptr<SimpleCdmPromise> promise) {
   DVLOG_FUNC(1);
 
-  // TODO(crbug.com/1298192): Handle DRM_E_TEE_INVALID_HWDRM_STATE. Right now
+  // TODO(crbug.com/40215444): Handle DRM_E_TEE_INVALID_HWDRM_STATE. Right now
   // DRM_E_TEE_INVALID_HWDRM_STATE is very rare in CloseSession() and there's
   // an open discussion on how this should behave in EME spec discussion.
   CloseSessionInternal(session_id, CdmSessionClosedReason::kClose,
diff --git a/media/cdm/win/test/media_foundation_clear_key_decryptor.cc b/media/cdm/win/test/media_foundation_clear_key_decryptor.cc
index f363ce1e..6fd5e9e 100644
--- a/media/cdm/win/test/media_foundation_clear_key_decryptor.cc
+++ b/media/cdm/win/test/media_foundation_clear_key_decryptor.cc
@@ -575,7 +575,7 @@
   // Decrypt the protected content.
   Decryptor::Status decryptor_status = Decryptor::kError;
 
-  // TODO(crbug.com/1442373): We may remove the tracking code of stream type
+  // TODO(crbug.com/40910495): We may remove the tracking code of stream type
   // if two decryptors get created for audio and video respectively.
   CHECK(stream_type_ != StreamType::kUnknown);
   Decryptor::StreamType stream_type = stream_type_ == StreamType::kVideo
diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc
index 2be0cf0..95301ce0 100644
--- a/media/filters/decoder_stream.cc
+++ b/media/filters/decoder_stream.cc
@@ -81,7 +81,7 @@
 }
 
 const char* GetStatusString(const DecoderStatus& status) {
-  // TODO(crbug.com/1129662): Replace this with generic Status-to-string.
+  // TODO(crbug.com/40149493): Replace this with generic Status-to-string.
   switch (status.code()) {
     case DecoderStatus::Codes::kOk:
       return "okay";
@@ -491,7 +491,7 @@
     }
   }
 
-  // TODO(https://crbug.com/1324732): We should DCHECK(CanDecodeMore()) here,
+  // TODO(crbug.com/40839438): We should DCHECK(CanDecodeMore()) here,
   // but this breaks a number of tests.
 
   if (!fallback_buffers_.empty()) {
diff --git a/media/filters/decrypting_demuxer_stream.cc b/media/filters/decrypting_demuxer_stream.cc
index 9b7c938..443846a 100644
--- a/media/filters/decrypting_demuxer_stream.cc
+++ b/media/filters/decrypting_demuxer_stream.cc
@@ -348,7 +348,7 @@
 
   // Copy the key frame flag and duration from the encrypted to decrypted
   // buffer.
-  // TODO(crbug.com/1116263): Ensure all fields are copied by Decryptor.
+  // TODO(crbug.com/40711813): Ensure all fields are copied by Decryptor.
   decrypted_buffer->set_is_key_frame(
       pending_buffer_to_decrypt_->is_key_frame());
   decrypted_buffer->set_duration(pending_buffer_to_decrypt_->duration());
diff --git a/media/formats/hls/tags.cc b/media/formats/hls/tags.cc
index 165d2d0..4ce3df8 100644
--- a/media/formats/hls/tags.cc
+++ b/media/formats/hls/tags.cc
@@ -941,7 +941,7 @@
   }
 
   // Extract duration
-  // TODO(crbug.com/1284763): Below version 3 this should be rounded to an
+  // TODO(crbug.com/40210233): Below version 3 this should be rounded to an
   // integer
   auto duration_result =
       types::ParseDecimalFloatingPoint(duration_str.SkipVariableSubstitution());
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index 32978473..6ab42e0d 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -176,7 +176,7 @@
       "mediandk",
     ]
     deps += [
-      # TODO(crbug.com/789435): This can be removed once CdmManager is removed.
+      # TODO(crbug.com/40552063): This can be removed once CdmManager is removed.
       "//gpu/ipc/common",
       "//media/mojo:buildflags",
       "//services/service_manager/public/cpp:cpp",
@@ -270,9 +270,7 @@
       ]
       deps += [ "//third_party/libaom:libaomrc" ]
     }
-    configs += [
-      "//third_party/khronos:khronos_headers",
-    ]
+    configs += [ "//third_party/khronos:khronos_headers" ]
     deps += [
       "//gpu/ipc/common:common",
       "//media/base/win:color_space_util_win",
diff --git a/media/gpu/h264_decoder.cc b/media/gpu/h264_decoder.cc
index 01e599e..56ccced0 100644
--- a/media/gpu/h264_decoder.cc
+++ b/media/gpu/h264_decoder.cc
@@ -847,7 +847,7 @@
         if (to_mark) {
           to_mark->ref = false;
         } else {
-          // TODO(crbug.com/1402627): consider doing the same for mmco 2 when
+          // TODO(crbug.com/40251206): consider doing the same for mmco 2 when
           // we can have testing for it, as how we handle missing |to_mark| for
           // mmco 1.
           DVLOG(1) << "Invalid long term ref pic num to unmark";
diff --git a/media/gpu/h265_decoder.cc b/media/gpu/h265_decoder.cc
index 1126009..f6e25b13 100644
--- a/media/gpu/h265_decoder.cc
+++ b/media/gpu/h265_decoder.cc
@@ -435,9 +435,9 @@
         if (par_res != H265Parser::kOk) {
           SET_ERROR_AND_RETURN();
         }
-        // TODO(crbug.com/1495665): Technically, we should cache a map of vps_id
-        // to aux_alpha_layer_id, and look up the aux_alpha_layer_id for each
-        // NALU.
+        // TODO(crbug.com/40937818): Technically, we should cache a map of
+        // vps_id to aux_alpha_layer_id, and look up the aux_alpha_layer_id for
+        // each NALU.
         aux_alpha_layer_id_ = parser_.GetVPS(vps_id)->aux_alpha_layer_id;
         accelerator_->ProcessVPS(
             parser_.GetVPS(vps_id),
diff --git a/media/gpu/mac/video_toolbox_video_decoder.cc b/media/gpu/mac/video_toolbox_video_decoder.cc
index 8bdec5b..9225569 100644
--- a/media/gpu/mac/video_toolbox_video_decoder.cc
+++ b/media/gpu/mac/video_toolbox_video_decoder.cc
@@ -47,7 +47,7 @@
 
 bool InitializeVP9() {
 #if BUILDFLAG(IS_MAC)
-  // TODO(crbug.com/1449877): Enable VP9 on iOS.
+  // TODO(crbug.com/40269929): Enable VP9 on iOS.
   if (__builtin_available(macOS 11.0, *)) {
     VTRegisterSupplementalVideoDecoderIfAvailable(kCMVideoCodecType_VP9);
     return VTIsHardwareDecodeSupported(kCMVideoCodecType_VP9);
diff --git a/media/gpu/mac/vt_video_decode_accelerator_mac.mm b/media/gpu/mac/vt_video_decode_accelerator_mac.mm
index 714841e..0d41a5c 100644
--- a/media/gpu/mac/vt_video_decode_accelerator_mac.mm
+++ b/media/gpu/mac/vt_video_decode_accelerator_mac.mm
@@ -797,7 +797,7 @@
     return false;
   }
 
-  // TODO(crbug.com/1103432): We should use
+  // TODO(crbug.com/40139254): We should use
   // VTDecompressionSessionCanAcceptFormatDescription() on |format| here to
   // avoid the configuration change if possible.
 
diff --git a/media/mojo/clients/mojo_decoder_factory.h b/media/mojo/clients/mojo_decoder_factory.h
index cb890cfd..760db09 100644
--- a/media/mojo/clients/mojo_decoder_factory.h
+++ b/media/mojo/clients/mojo_decoder_factory.h
@@ -31,7 +31,7 @@
       MediaLog* media_log,
       std::vector<std::unique_ptr<AudioDecoder>>* audio_decoders) final;
 
-  // TODO(crbug.com/1173503): Implement GetSupportedVideoDecoderConfigs.
+  // TODO(crbug.com/40167137): Implement GetSupportedVideoDecoderConfigs.
 
   void CreateVideoDecoders(
       scoped_refptr<base::SequencedTaskRunner> task_runner,
diff --git a/media/mojo/mojom/decryptor.mojom b/media/mojo/mojom/decryptor.mojom
index 5630ce8..d1cb72ab 100644
--- a/media/mojo/mojom/decryptor.mojom
+++ b/media/mojo/mojom/decryptor.mojom
@@ -8,7 +8,7 @@
 
 // Interface for decrypting (and decoding) encrypted streams.
 // See media/base/decryptor.h for details.
-// TODO(crbug.com/794326): Deduplicate this interface with audio_decoder.mojom
+// TODO(crbug.com/40554405): Deduplicate this interface with audio_decoder.mojom
 // and audio_decoder.mojom.
 interface Decryptor {
   // Status of a decrypt or decrypt-and-decode operation. See decryptor.h for
diff --git a/media/mojo/services/mojo_cdm_helper_unittest.cc b/media/mojo/services/mojo_cdm_helper_unittest.cc
index ca93d82b2..ab3307a 100644
--- a/media/mojo/services/mojo_cdm_helper_unittest.cc
+++ b/media/mojo/services/mojo_cdm_helper_unittest.cc
@@ -121,6 +121,6 @@
   base::RunLoop().RunUntilIdle();
 }
 
-// TODO(crbug.com/773860): Add more test cases.
+// TODO(crbug.com/40544338): Add more test cases.
 
 }  // namespace media
diff --git a/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc
index bd0c6f37..d7c7925c1 100644
--- a/media/renderers/paint_canvas_video_renderer.cc
+++ b/media/renderers/paint_canvas_video_renderer.cc
@@ -1583,7 +1583,7 @@
     return false;
   }
 
-  // TODO(crbug.com/1108154): Support more texture target, e.g.
+  // TODO(crbug.com/40141173): Support more texture target, e.g.
   // 2d array, 3d etc.
   if (target != GL_TEXTURE_2D) {
     return false;
diff --git a/media/renderers/video_frame_rgba_to_yuva_converter.cc b/media/renderers/video_frame_rgba_to_yuva_converter.cc
index 7c0c7e1..2916b4d 100644
--- a/media/renderers/video_frame_rgba_to_yuva_converter.cc
+++ b/media/renderers/video_frame_rgba_to_yuva_converter.cc
@@ -202,7 +202,7 @@
       // case resulted in pixeltest failures due to pixel bleeding around image
       // borders that we weren't able to resolve (see crbug.com/1451025 for
       // details).
-      // TODO(crbug.com/1451025): Update this comment when we resolve that bug
+      // TODO(crbug.com/40270413): Update this comment when we resolve that bug
       // and change CopySharedImage() to crop rather than stretch.
       ri->CopySharedImage(src_mailbox_holder.mailbox,
                           dst_mailbox_holder.mailbox, GL_TEXTURE_2D, 0, 0, 0, 0,
diff --git a/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc
index 8737ec54b..b2f0452 100644
--- a/media/renderers/video_resource_updater.cc
+++ b/media/renderers/video_resource_updater.cc
@@ -702,7 +702,7 @@
     DCHECK(context_provider_);
     auto* sii = SharedImageInterface();
     if (format.is_single_plane()) {
-      // TODO(crbug.com/1366495): Set `overlay_candidate_` for multiplanar
+      // TODO(crbug.com/40239769): Set `overlay_candidate_` for multiplanar
       // formats.
       overlay_candidate_ =
           use_gpu_memory_buffer_resources &&
diff --git a/media/renderers/win/media_foundation_renderer.cc b/media/renderers/win/media_foundation_renderer.cc
index e545542..3a45a62 100644
--- a/media/renderers/win/media_foundation_renderer.cc
+++ b/media/renderers/win/media_foundation_renderer.cc
@@ -1093,7 +1093,7 @@
   // it here.
   PipelineStatus new_status = status;
   if (hresult == DRM_E_TEE_INVALID_HWDRM_STATE) {
-    // TODO(crbug.com/1370844): Remove these after the investigation is done.
+    // TODO(crbug.com/40870069): Remove these after the investigation is done.
     base::UmaHistogramBoolean(
         "Media.MediaFoundationRenderer.InvalidHwdrmState.HasReportedPlaying",
         has_reported_playing_);
diff --git a/media/renderers/win/media_foundation_source_wrapper.cc b/media/renderers/win/media_foundation_source_wrapper.cc
index a310b57..d64bca3 100644
--- a/media/renderers/win/media_foundation_source_wrapper.cc
+++ b/media/renderers/win/media_foundation_source_wrapper.cc
@@ -59,7 +59,7 @@
   }
   int stream_id = 0;
   for (DemuxerStream* demuxer_stream : demuxer_streams) {
-    // TODO(crbug.com/1453682): MediaFoundationRenderer playback won't end
+    // TODO(crbug.com/40272014): MediaFoundationRenderer playback won't end
     // after hitting the end of the video stream if no audio device. If any
     // video stream is available but no audio device, do not create an instance
     // of the MediaFoundationStreamWrapper so that the video playback can end
diff --git a/media/test/pipeline_integration_test.cc b/media/test/pipeline_integration_test.cc
index c9126df..2ea7f12 100644
--- a/media/test/pipeline_integration_test.cc
+++ b/media/test/pipeline_integration_test.cc
@@ -2111,7 +2111,7 @@
   // provided by the operating system and will apply DRC based on device
   // specific params.
 
-  // TODO(crbug.com/1289825): Seeking doesn't always work properly when using
+  // TODO(crbug.com/40817722): Seeking doesn't always work properly when using
   // ffmpeg since it doesn't handle non-keyframe xHE-AAC samples properly.
 }
 
diff --git a/media/video/video_encode_accelerator_adapter.cc b/media/video/video_encode_accelerator_adapter.cc
index d469e1d4..74c4ef7d 100644
--- a/media/video/video_encode_accelerator_adapter.cc
+++ b/media/video/video_encode_accelerator_adapter.cc
@@ -54,7 +54,7 @@
 }
 
 uint32_t ComputeCheckedPeakBitrate(uint32_t target_bitrate) {
-  // TODO(crbug.com/1342850): Reconsider whether this is good peak bps.
+  // TODO(crbug.com/40851972): Reconsider whether this is good peak bps.
   base::CheckedNumeric<uint32_t> checked_bitrate_product =
       base::CheckMul<uint32_t>(target_bitrate, 10u);
   return checked_bitrate_product.ValueOrDefault(
diff --git a/mojo/core/channel_win.cc b/mojo/core/channel_win.cc
index dc5bbc0..d404ab5 100644
--- a/mojo/core/channel_win.cc
+++ b/mojo/core/channel_win.cc
@@ -203,7 +203,7 @@
       reject_writes_ = true;
     }
 
-    // TODO(https://crbug.com/583525): This function is expected to be called
+    // TODO(crbug.com/40455076): This function is expected to be called
     // once, and |handle_| should be valid at this point.
     CHECK(handle_.is_valid());
     CancelIo(handle_.get());
diff --git a/mojo/core/node_channel.cc b/mojo/core/node_channel.cc
index da55656..914dd19 100644
--- a/mojo/core/node_channel.cc
+++ b/mojo/core/node_channel.cc
@@ -509,7 +509,7 @@
   // will leak, but that means something else has probably broken and the
   // sending process won't likely be around much longer.
   //
-  // TODO(https://crbug.com/813112): We would like to be able to violate the
+  // TODO(crbug.com/40563346): We would like to be able to violate the
   // above stated assumption. We should not leak handles in cases where we
   // outlive the broker, as we may continue existing and eventually accept a new
   // broker invitation.
diff --git a/mojo/core/node_controller.cc b/mojo/core/node_controller.cc
index 4a6eb296..4413285a 100644
--- a/mojo/core/node_controller.cc
+++ b/mojo/core/node_controller.cc
@@ -1176,7 +1176,7 @@
   {
     base::AutoLock lock(reserved_ports_lock_);
     auto it = reserved_ports_.find(from_node);
-    // TODO(https://crbug.com/822034): We should send a notification back to the
+    // TODO(crbug.com/40567118): We should send a notification back to the
     // requestor so they can clean up their dangling port in this failure case.
     // This requires changes to the internal protocol, which can't be made yet.
     // Until this is done, pipes from |MojoExtractMessagePipeFromInvitation()|
diff --git a/mojo/core/ports/port_locker.cc b/mojo/core/ports/port_locker.cc
index 1cfcf96..ab5d2f7f 100644
--- a/mojo/core/ports/port_locker.cc
+++ b/mojo/core/ports/port_locker.cc
@@ -38,7 +38,7 @@
       port_refs_, port_refs_ + num_ports_,
       [](const PortRef* a, const PortRef* b) { return a->port() < b->port(); });
   for (size_t i = 0; i < num_ports_; ++i) {
-    // TODO(crbug.com/725605): Remove this CHECK.
+    // TODO(crbug.com/40522227): Remove this CHECK.
     CHECK(port_refs_[i]->port());
     port_refs_[i]->port()->lock_.Acquire();
   }
diff --git a/mojo/public/c/system/types.h b/mojo/public/c/system/types.h
index ce541c6..ec8c1f092 100644
--- a/mojo/public/c/system/types.h
+++ b/mojo/public/c/system/types.h
@@ -273,7 +273,7 @@
 MOJO_STATIC_ASSERT(sizeof(struct MojoHandleSignalsState) == 8,
                    "MojoHandleSignalsState has wrong size");
 
-// TODO(https://crbug.com/819046): Remove these aliases.
+// TODO(crbug.com/40565809): Remove these aliases.
 #define MOJO_WATCH_CONDITION_SATISFIED MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED
 #define MOJO_WATCH_CONDITION_NOT_SATISFIED \
   MOJO_TRIGGER_CONDITION_SIGNALS_UNSATISFIED
diff --git a/mojo/public/cpp/bindings/tests/remote_unittest.cc b/mojo/public/cpp/bindings/tests/remote_unittest.cc
index babf926a9b..caa20f0 100644
--- a/mojo/public/cpp/bindings/tests/remote_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/remote_unittest.cc
@@ -1469,7 +1469,7 @@
   Receiver<mojom::LargeMessageTest> receiver_;
 };
 
-// TODO(crbug.com/1329178): Flaky on Linux/ASAN, Mac, and Fuchsia bots.
+// TODO(crbug.com/40226674): Flaky on Linux/ASAN, Mac, and Fuchsia bots.
 TEST_P(RemoteTest, DISABLED_SendVeryLargeMessages) {
   Remote<mojom::LargeMessageTest> remote;
   LargeMessageTestImpl impl(remote.BindNewPipeAndPassReceiver());
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
index 801c2a7..f4e9645 100644
--- a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
+++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
@@ -497,7 +497,7 @@
                         }
                     }
                     if (defaultNetwork != null) {
-                        // TODO(https://crbug.com/1361170): Investigate why there are multiple
+                        // TODO(crbug.com/40060873): Investigate why there are multiple
                         // connected networks.
                         Log.e(
                                 TAG,
@@ -1216,7 +1216,7 @@
 
     /**
      * Updates internally stored network state by querying the current state from the system.
-     * TODO(crbug/1493005): migrate external callers to getCurrentNetworkState() and make this
+     * TODO(crbug.com/40936429): migrate external callers to getCurrentNetworkState() and make this
      * method private (to be called only when updates are received from the system.)
      */
     public void updateCurrentNetworkState() {
diff --git a/net/base/features.h b/net/base/features.h
index 3c97e24..1951fee 100644
--- a/net/base/features.h
+++ b/net/base/features.h
@@ -271,7 +271,7 @@
 // When enabled, UDPSocketPosix increments the global counter of bytes received
 // every time bytes are received, instead of using a timer to batch updates.
 // This should reduce the number of wake ups and improve battery consumption.
-// TODO(https://crbug.com/1189805): Cleanup the feature after verifying that it
+// TODO(crbug.com/40755656): Cleanup the feature after verifying that it
 // doesn't negatively affect performance.
 NET_EXPORT BASE_DECLARE_FEATURE(kUdpSocketPosixAlwaysUpdateBytesReceived);
 #endif  // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
diff --git a/net/base/filename_util_unittest.cc b/net/base/filename_util_unittest.cc
index 664b8bea..f6f6f2f5 100644
--- a/net/base/filename_util_unittest.cc
+++ b/net/base/filename_util_unittest.cc
@@ -36,7 +36,7 @@
 };
 
 // The expected filenames are coded as wchar_t for convenience.
-// TODO(https://crbug.com/911896): Make these char16_t once std::u16string is
+// TODO(crbug.com/40605133): Make these char16_t once std::u16string is
 // std::u16string.
 std::wstring FilePathAsWString(const base::FilePath& path) {
 #if BUILDFLAG(IS_WIN)
diff --git a/net/base/net_error_list.h b/net/base/net_error_list.h
index 8d32558..7895c59a 100644
--- a/net/base/net_error_list.h
+++ b/net/base/net_error_list.h
@@ -267,7 +267,7 @@
 // received a 302 (temporary redirect) response.  The response body might
 // include a description of why the request failed.
 //
-// TODO(https://crbug.com/928551): This is deprecated and should not be used by
+// TODO(crbug.com/40093955): This is deprecated and should not be used by
 // new code.
 NET_ERROR(HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT, -140)
 
diff --git a/net/base/net_errors.cc b/net/base/net_errors.cc
index 8f883a7..4650ad7 100644
--- a/net/base/net_errors.cc
+++ b/net/base/net_errors.cc
@@ -46,7 +46,7 @@
 #include "net/base/net_error_list.h"
 #undef NET_ERROR
   default:
-    // TODO(crbug.com/1439949): Figure out why this is firing, fix and upgrade
+    // TODO(crbug.com/40909121): Figure out why this is firing, fix and upgrade
     // this to be fatal.
     DUMP_WILL_BE_NOTREACHED_NORETURN() << error;
     error_string = "<unknown>";
diff --git a/net/base/network_isolation_key.h b/net/base/network_isolation_key.h
index 9c159400..1fc0809 100644
--- a/net/base/network_isolation_key.h
+++ b/net/base/network_isolation_key.h
@@ -46,7 +46,7 @@
       std::optional<base::UnguessableToken>&& nonce = std::nullopt);
 
   // Legacy constructor.
-  // TODO(https://crbug.com/1145294):  Remove this in favor of above
+  // TODO(crbug.com/40729378):  Remove this in favor of above
   // constructor.
   NetworkIsolationKey(const url::Origin& top_frame_origin,
                       const url::Origin& frame_origin);
diff --git a/net/base/proxy_string_util.h b/net/base/proxy_string_util.h
index 9751720..bde65af 100644
--- a/net/base/proxy_string_util.h
+++ b/net/base/proxy_string_util.h
@@ -47,7 +47,7 @@
 //   "BLAH xxx:xx"      INVALID
 NET_EXPORT ProxyChain
 PacResultElementToProxyChain(std::string_view pac_result_element);
-// TODO(crbug.com/1491092): Remove method once all calls are updated to use
+// TODO(crbug.com/40284947): Remove method once all calls are updated to use
 // PacResultElementToProxyChain.
 NET_EXPORT ProxyServer
 PacResultElementToProxyServer(std::string_view pac_result_element);
diff --git a/net/base/registry_controlled_domains/registry_controlled_domain.cc b/net/base/registry_controlled_domains/registry_controlled_domain.cc
index 425b469..b28cadc 100644
--- a/net/base/registry_controlled_domains/registry_controlled_domain.cc
+++ b/net/base/registry_controlled_domains/registry_controlled_domain.cc
@@ -132,7 +132,7 @@
       // "!foo").  This would only be valid if we had a corresponding
       // wildcard rule, which would have to be "*".  But we explicitly
       // disallow that case, so this kind of rule is invalid.
-      // TODO(https://crbug.com/459802): This assumes that all wildcard entries,
+      // TODO(crbug.com/40406311): This assumes that all wildcard entries,
       // such as *.foo.invalid, also have their parent, foo.invalid, as an entry
       // on the PSL, which is why it returns the length of foo.invalid. This
       // isn't entirely correct.
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc
index 0d1275a6..c429c08 100644
--- a/net/cookies/canonical_cookie.cc
+++ b/net/cookies/canonical_cookie.cc
@@ -277,7 +277,7 @@
     return expiry_date;
   base::Time fixed_creation_date = creation_date;
   if (fixed_creation_date.is_null()) {
-    // TODO(crbug.com/1264458): Push this logic into
+    // TODO(crbug.com/40800807): Push this logic into
     // CanonicalCookie::CreateSanitizedCookie. The four sites that call it
     // with a null `creation_date` (CanonicalCookie::Create cannot be called
     // this way) are:
@@ -917,7 +917,7 @@
   // would fail this check. Note that we still don't want to enforce length
   // checks on domain or path for the reason stated above.
 
-  // TODO(crbug.com/1264458): Eventually we should push this logic into
+  // TODO(crbug.com/40800807): Eventually we should push this logic into
   // IsCanonicalForFromStorage, but for now we allow cookies already stored with
   // high expiration dates to be retrieved.
   if (ValidateAndAdjustExpiryDate(expiry_date_, CreationDate(),
diff --git a/net/cookies/cookie_base.cc b/net/cookies/cookie_base.cc
index b5b67045..588b292 100644
--- a/net/cookies/cookie_base.cc
+++ b/net/cookies/cookie_base.cc
@@ -347,7 +347,7 @@
                 : CookieInclusionStatus::EXCLUDE_SAMESITE_LAX);
       }
       break;
-    // TODO(crbug.com/990439): Add a browsertest for this behavior.
+    // TODO(crbug.com/40638805): Add a browsertest for this behavior.
     case CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE:
       DCHECK(SameSite() == CookieSameSite::UNSPECIFIED);
       if (cookie_inclusion_context <
diff --git a/net/cookies/cookie_change_dispatcher.h b/net/cookies/cookie_change_dispatcher.h
index 68f9db1..72c62a3 100644
--- a/net/cookies/cookie_change_dispatcher.h
+++ b/net/cookies/cookie_change_dispatcher.h
@@ -160,7 +160,7 @@
   //
   // The callback will not observe a few bookkeeping changes.
   // See kChangeCauseMapping in cookie_monster.cc for details.
-  // TODO(crbug.com/1225444): Add support for Partitioned cookies.
+  // TODO(crbug.com/40188414): Add support for Partitioned cookies.
   [[nodiscard]] virtual std::unique_ptr<CookieChangeSubscription>
   AddCallbackForAllChanges(CookieChangeCallback callback) = 0;
 };
diff --git a/net/cookies/cookie_constants_unittest.cc b/net/cookies/cookie_constants_unittest.cc
index b99b192..4e85e879 100644
--- a/net/cookies/cookie_constants_unittest.cc
+++ b/net/cookies/cookie_constants_unittest.cc
@@ -37,7 +37,7 @@
   }
 }
 
-// TODO(crbug.com/996811): Add tests for multiple possibly-invalid attributes.
+// TODO(crbug.com/40641705): Add tests for multiple possibly-invalid attributes.
 TEST(CookieConstantsTest, TestCookieSameSite) {
   // Test case insensitivity
   EXPECT_EQ(CookieSameSite::NO_RESTRICTION, StringToCookieSameSite("None"));
diff --git a/net/cookies/cookie_deletion_info.h b/net/cookies/cookie_deletion_info.h
index c1d82f9..1d82498 100644
--- a/net/cookies/cookie_deletion_info.h
+++ b/net/cookies/cookie_deletion_info.h
@@ -31,7 +31,7 @@
   // single time) where |end| is inclusive. This special case is for iOS that
   // will be removed in the future.
   //
-  // TODO(crbug.com/830689): Delete the start=end special case.
+  // TODO(crbug.com/40570811): Delete the start=end special case.
   class NET_EXPORT TimeRange {
    public:
     // Default constructor matches any non-null time.
diff --git a/net/cookies/cookie_inclusion_status.h b/net/cookies/cookie_inclusion_status.h
index 92a61d5..5d4e1eb5 100644
--- a/net/cookies/cookie_inclusion_status.h
+++ b/net/cookies/cookie_inclusion_status.h
@@ -24,7 +24,7 @@
 // exclusion, where cookie inclusion is represented by the absence of any
 // exclusion reasons. Also marks whether a cookie should be warned about, e.g.
 // for deprecation or intervention reasons.
-// TODO(crbug.com/1310444): Improve serialization validation comments.
+// TODO(crbug.com/40219875): Improve serialization validation comments.
 class NET_EXPORT CookieInclusionStatus {
  public:
   // Types of reasons why a cookie might be excluded.
@@ -403,7 +403,7 @@
 
   // Validates mojo data, since mojo does not support bitsets. ExemptionReason
   // is omitted intendedly.
-  // TODO(crbug.com/1310444): Improve serialization validation comments
+  // TODO(crbug.com/40219875): Improve serialization validation comments
   // and check for mutually exclusive values.
   static bool ValidateExclusionAndWarningFromWire(uint32_t exclusion_reasons,
                                                   uint32_t warning_reasons);
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc
index 02ace3e..d3fad063 100644
--- a/net/cookies/cookie_monster.cc
+++ b/net/cookies/cookie_monster.cc
@@ -1200,7 +1200,7 @@
     // duplicates.
     dupes.erase(dupes.begin());
 
-    // TODO(crbug.com/1225444) Include cookie partition key in this log
+    // TODO(crbug.com/40188414) Include cookie partition key in this log
     // statement as well if needed.
     // TODO(crbug.com/1170548): Include source scheme and source port.
     LOG(ERROR) << base::StringPrintf(
@@ -1251,7 +1251,7 @@
     // duplicates.
     dupes.erase(dupes.begin());
 
-    // TODO(crbug.com/1225444) Include cookie partition key in this log
+    // TODO(crbug.com/40188414) Include cookie partition key in this log
     // statement as well if needed.
     // TODO(crbug.com/1170548): Include source scheme and source port.
     LOG(ERROR) << base::StringPrintf(
@@ -1782,8 +1782,9 @@
       // http:// URLs, but not cookies that are cleared by http:// URLs, to
       // understand if the former behavior can be deprecated for Secure
       // cookies.
-      // TODO(crbug.com/993120): Consider removing this histogram. The decision
-      // it was added to evaluate has been implemented and standardized.
+      // TODO(crbug.com/40640080): Consider removing this histogram. The
+      // decision it was added to evaluate has been implemented and
+      // standardized.
       CookieSource cookie_source_sample =
           (source_url.SchemeIsCryptographic()
                ? (cc->SecureAttribute()
@@ -2218,7 +2219,7 @@
   if (NumBytesInCookieMapForKey(*cookie_partition_it->second.get(), key) >
           kPerPartitionDomainMaxCookieBytes ||
       cookie_partition_it->second->count(key) > kPerPartitionDomainMaxCookies) {
-    // TODO(crbug.com/1225444): Log garbage collection for partitioned cookies.
+    // TODO(crbug.com/40188414): Log garbage collection for partitioned cookies.
 
     CookieItVector non_expired_cookie_its;
     num_deleted += GarbageCollectExpiredPartitionedCookies(
@@ -2229,7 +2230,7 @@
 
     if (bytes_used > kPerPartitionDomainMaxCookieBytes ||
         non_expired_cookie_its.size() > kPerPartitionDomainMaxCookies) {
-      // TODO(crbug.com/1225444): Log deep garbage collection for partitioned
+      // TODO(crbug.com/40188414): Log deep garbage collection for partitioned
       // cookies.
       std::sort(non_expired_cookie_its.begin(), non_expired_cookie_its.end(),
                 LRACookieSorter);
@@ -2247,7 +2248,7 @@
     }
   }
 
-  // TODO(crbug.com/1225444): Enforce global limit on partitioned cookies.
+  // TODO(crbug.com/40188414): Enforce global limit on partitioned cookies.
 
   return num_deleted;
 }
diff --git a/net/cookies/cookie_monster.h b/net/cookies/cookie_monster.h
index e302feb..b4cb9c4c 100644
--- a/net/cookies/cookie_monster.h
+++ b/net/cookies/cookie_monster.h
@@ -142,7 +142,8 @@
   // Partitioned cookie garbage collection thresholds.
   static const size_t kPerPartitionDomainMaxCookieBytes;
   static const size_t kPerPartitionDomainMaxCookies;
-  // TODO(crbug.com/1225444): Add global limit to number of partitioned cookies.
+  // TODO(crbug.com/40188414): Add global limit to number of partitioned
+  // cookies.
 
   // Quota for cookies with {low, medium, high} priorities within a domain.
   static const size_t kDomainCookiesQuotaLow;
diff --git a/net/cookies/cookie_monster_unittest.cc b/net/cookies/cookie_monster_unittest.cc
index 51821e52..b3dac3b4 100644
--- a/net/cookies/cookie_monster_unittest.cc
+++ b/net/cookies/cookie_monster_unittest.cc
@@ -2860,7 +2860,7 @@
 }
 
 // Test that cookies transfer from/to the backing store correctly.
-// TODO(crbug.com/1225444): Include partitioned cookies in this test when we
+// TODO(crbug.com/40188414): Include partitioned cookies in this test when we
 // start saving them in the persistent store.
 TEST_F(CookieMonsterTest, BackingStoreCommunication) {
   // Store details for cookies transforming through the backing store interface.
diff --git a/net/cookies/cookie_partition_key.h b/net/cookies/cookie_partition_key.h
index 1e1b1798..919748f 100644
--- a/net/cookies/cookie_partition_key.h
+++ b/net/cookies/cookie_partition_key.h
@@ -82,7 +82,7 @@
   // we will not be able to attach the saved cookie to any future requests. This
   // is because opaque origins' nonces are only stored in volatile memory.
   //
-  // TODO(crbug.com/1225444) Investigate ways to persist partition keys with
+  // TODO(crbug.com/40188414) Investigate ways to persist partition keys with
   // opaque origins if a browser session is restored.
   [[nodiscard]] static base::expected<SerializedCookiePartitionKey, std::string>
   Serialize(const std::optional<CookiePartitionKey>& in);
@@ -121,7 +121,7 @@
   // either the `from_script_` flag should be set or the cookie partition key
   // should match the browser's. Otherwise the renderer may be compromised.
   //
-  // TODO(crbug.com/1225444) Consider removing this factory method and
+  // TODO(crbug.com/40188414) Consider removing this factory method and
   // `from_script_` flag when BlinkStorageKey is available in
   // ServiceWorkerGlobalScope.
   static std::optional<CookiePartitionKey> FromScript() {
diff --git a/net/cookies/cookie_partition_key_collection.h b/net/cookies/cookie_partition_key_collection.h
index 53bb325..4032cef16 100644
--- a/net/cookies/cookie_partition_key_collection.h
+++ b/net/cookies/cookie_partition_key_collection.h
@@ -54,7 +54,7 @@
   // Returns an empty key collection, so no partitioned cookies will be returned
   // at callsites this is used.
   //
-  // TODO(crbug.com/1225444): Remove this method and update callsites to use
+  // TODO(crbug.com/40188414): Remove this method and update callsites to use
   // appropriate constructor.
   static CookiePartitionKeyCollection Todo() {
     return CookiePartitionKeyCollection();
diff --git a/net/disk_cache/blockfile/backend_impl.cc b/net/disk_cache/blockfile/backend_impl.cc
index 1608393b..80fdaeb 100644
--- a/net/disk_cache/blockfile/backend_impl.cc
+++ b/net/disk_cache/blockfile/backend_impl.cc
@@ -333,7 +333,7 @@
 
     if (user_flags_ & kNoRandom) {
       // This is a net_unittest, verify that we are not 'leaking' entries.
-      // TODO(https://crbug.com/1184679): Refactor this and eliminate the
+      // TODO(crbug.com/40171748): Refactor this and eliminate the
       //    WaitForPendingIOForTesting API.
       File::WaitForPendingIOForTesting(&num_pending_io_);
       DCHECK(!num_refs_);
diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc
index 308f751..9d660db 100644
--- a/net/dns/dns_transaction.cc
+++ b/net/dns/dns_transaction.cc
@@ -1502,7 +1502,7 @@
     const DnsConfig& config = session_->config();
     DCHECK_LT(server_index, config.nameservers.size());
 
-    // TODO(https://crbug.com/1123197): Pass a non-null NetworkQualityEstimator.
+    // TODO(crbug.com/40146880): Pass a non-null NetworkQualityEstimator.
     NetworkQualityEstimator* network_quality_estimator = nullptr;
 
     std::unique_ptr<StreamSocket> socket =
diff --git a/net/dns/host_resolver.cc b/net/dns/host_resolver.cc
index f06bc628..8ed64a9 100644
--- a/net/dns/host_resolver.cc
+++ b/net/dns/host_resolver.cc
@@ -486,7 +486,7 @@
 
 // static
 int HostResolver::SquashErrorCode(int error) {
-  // TODO(crbug.com/1043281): Consider squashing ERR_INTERNET_DISCONNECTED.
+  // TODO(crbug.com/40668952): Consider squashing ERR_INTERNET_DISCONNECTED.
   if (error == OK || error == ERR_IO_PENDING ||
       error == ERR_INTERNET_DISCONNECTED || error == ERR_NAME_NOT_RESOLVED ||
       error == ERR_DNS_NAME_HTTPS_ONLY) {
diff --git a/net/dns/host_resolver.h b/net/dns/host_resolver.h
index f9ad2e7..afebfa0 100644
--- a/net/dns/host_resolver.h
+++ b/net/dns/host_resolver.h
@@ -87,10 +87,10 @@
   // Handler for an individual host resolution request. Created by
   // HostResolver::CreateRequest().
   //
-  // TODO(crbug.com/1290920): Most result retrieval here follows a pattern where
-  // it may return null or empty for requests where that result type is not
-  // available. Clean this up to always return empty for such cases and remove
-  // nullability from the return types.
+  // TODO(crbug.com/40212535): Most result retrieval here follows a pattern
+  // where it may return null or empty for requests where that result type is
+  // not available. Clean this up to always return empty for such cases and
+  // remove nullability from the return types.
   class ResolveHostRequest {
    public:
     // Destruction cancels the request if running asynchronously, causing the
@@ -392,11 +392,11 @@
     // the system resolver, e.g. non-address requests or requests specifying a
     // non-`SYSTEM` `source`.
     //
-    // TODO(crbug.com/1282281): Consider allowing the built-in resolver to still
-    // be used with this parameter. Would then function as a request to just
-    // keep the single final name from the alias chain instead of all aliases,
-    // and also skip the canonicalization unless that canonicalization is found
-    // to be fine for usage.
+    // TODO(crbug.com/40209534): Consider allowing the built-in resolver to
+    // still be used with this parameter. Would then function as a request to
+    // just keep the single final name from the alias chain instead of all
+    // aliases, and also skip the canonicalization unless that canonicalization
+    // is found to be fine for usage.
     bool include_canonical_name = false;
 
     // Hint to the resolver that resolution is only being requested for loopback
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
index 9b911a7..7f69276 100644
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -1558,7 +1558,7 @@
   dispatcher_->SetLimits(limits);
 }
 
-// TODO(crbug.com/995984): Consider removing this and its usage.
+// TODO(crbug.com/40641277): Consider removing this and its usage.
 void HostResolverManager::TryServingAllJobsFromHosts() {
   if (!dns_client_ || !dns_client_->GetEffectiveConfig())
     return;
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store.cc b/net/extras/sqlite/sqlite_persistent_cookie_store.cc
index 88ea3e8..196d0ee9 100644
--- a/net/extras/sqlite/sqlite_persistent_cookie_store.cc
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store.cc
@@ -1596,8 +1596,8 @@
     LOG(WARNING) << "Unable to delete session cookies.";
 }
 
-// TODO(crbug.com/1225444) Investigate including top_frame_site_key in the WHERE
-// clause.
+// TODO(crbug.com/40188414) Investigate including top_frame_site_key in the
+// WHERE clause.
 void SQLitePersistentCookieStore::Backend::BackgroundDeleteAllInList(
     const std::list<CookieOrigin>& cookies) {
   DCHECK(background_task_runner()->RunsTasksInCurrentSequence());
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
index a62086448..39e723c6e 100644
--- a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
@@ -776,7 +776,7 @@
 
     stmt.BindInt64(0, creation_time++);
     stmt.BindString(1, cookie_info.domain);
-    // TODO(crbug.com/1225444) Test some non-empty values when CanonicalCookie
+    // TODO(crbug.com/40188414) Test some non-empty values when CanonicalCookie
     // supports partition key.
     stmt.BindString(2, net::kEmptyCookiePartitionKey);
     stmt.BindString(3, cookie_info.name);
diff --git a/net/http/http_cache_writers.cc b/net/http/http_cache_writers.cc
index 6f619089..fb2be5bd 100644
--- a/net/http/http_cache_writers.cc
+++ b/net/http/http_cache_writers.cc
@@ -398,7 +398,7 @@
   DCHECK(network_transaction_);
   next_state_ = State::NETWORK_READ_COMPLETE;
 
-  // TODO(https://crbug.com/778641): This is a partial mitigation. When
+  // TODO(crbug.com/40089413): This is a partial mitigation. When
   // reading from the network, a valid HttpNetworkTransaction must be always
   // available.
   if (!network_transaction_) {
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index cc4b28d4..fe593c1 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -1672,7 +1672,7 @@
 
   bool is_server = !UsingHttpProxyWithoutTunnel();
   HostPortPair host_port_pair;
-  // TODO(https://crbug.com/1491092): Remove check and return error when
+  // TODO(crbug.com/40284947): Remove check and return error when
   // multi-proxy chain.
   if (is_server) {
     host_port_pair = HostPortPair::FromURL(request_->url);
@@ -1968,7 +1968,7 @@
 }
 
 bool HttpNetworkTransaction::ShouldApplyProxyAuth() const {
-  // TODO(https://crbug.com/1491092): Update to handle multi-proxy chains.
+  // TODO(crbug.com/40284947): Update to handle multi-proxy chains.
   if (proxy_info_.proxy_chain().is_multi_proxy()) {
     return false;
   }
@@ -2016,7 +2016,7 @@
 GURL HttpNetworkTransaction::AuthURL(HttpAuth::Target target) const {
   switch (target) {
     case HttpAuth::AUTH_PROXY: {
-      // TODO(https://crbug.com/1491092): Update to handle multi-proxy chain.
+      // TODO(crbug.com/40284947): Update to handle multi-proxy chain.
       CHECK(proxy_info_.proxy_chain().is_single_proxy());
       if (!proxy_info_.proxy_chain().IsValid() ||
           proxy_info_.proxy_chain().is_direct()) {
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index 7cb27e7..704ff5e 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -7214,7 +7214,7 @@
 }
 
 // Test that a proxy server requesting a client auth cert doesn't cause a crash.
-// TODO(https://crbug.com/1491092): This test can be deleted once we no longer
+// TODO(crbug.com/40284947): This test can be deleted once we no longer
 // need the multi-proxy chain version below, since this functionality should
 // be sufficiently tested elsewhere. For now this test just shows that
 // single-proxy and multi-proxy behavior is consistent (when a read returns
@@ -7280,7 +7280,7 @@
 
 // Test that the first proxy server in a multi-proxy chain requesting a client
 // auth cert doesn't cause a crash.
-// TODO(https://crbug.com/1491092): Support client auth certificates for
+// TODO(crbug.com/40284947): Support client auth certificates for
 // multi-proxy chains and then replace this test with a more robust one (for
 // instance, a version of the AuthEverywhere test that uses a multi-proxy
 // chain).
@@ -7355,7 +7355,7 @@
 
 // Same as above but using a different method to request the client auth
 // certificate.
-// TODO(https://crbug.com/1491092): Support client auth certificates for
+// TODO(crbug.com/40284947): Support client auth certificates for
 // multi-proxy chains and then replace this test with a more robust one (for
 // instance, a version of the AuthEverywhere test that uses a multi-proxy
 // chain).
@@ -7416,7 +7416,7 @@
 
 // Test that a read returning ERR_SSL_CLIENT_AUTH_CERT_NEEDED after the first
 // CONNECT doesn't result in a crash when a multi-proxy chain is in use.
-// TODO(https://crbug.com/1491092): Support client auth certificates for
+// TODO(crbug.com/40284947): Support client auth certificates for
 // multi-proxy chains and then replace this test with a more robust one (for
 // instance, a version of the AuthEverywhere test that uses a multi-proxy
 // chain).
@@ -7516,7 +7516,7 @@
 
 // Test that the second proxy server in a multi-proxy chain requesting a client
 // auth cert doesn't cause a crash.
-// TODO(https://crbug.com/1491092): Support client auth certificates for
+// TODO(crbug.com/40284947): Support client auth certificates for
 // multi-proxy chains and then replace this test with a more robust one (for
 // instance, a version of the AuthEverywhere test that uses a multi-proxy
 // chain).
@@ -7602,7 +7602,7 @@
 
 // Test that the endpoint requesting a client auth cert over a multi-proxy chain
 // tunnel doesn't cause a crash.
-// TODO(https://crbug.com/1491092): Support client auth certificates for
+// TODO(crbug.com/40284947): Support client auth certificates for
 // multi-proxy chains and then replace this test with a more robust one (for
 // instance, a version of the AuthEverywhere test that uses a multi-proxy
 // chain).
diff --git a/net/http/http_proxy_connect_job.cc b/net/http/http_proxy_connect_job.cc
index 3f9d2a02..d82e78e 100644
--- a/net/http/http_proxy_connect_job.cc
+++ b/net/http/http_proxy_connect_job.cc
@@ -540,7 +540,7 @@
         // cert request info won't have been set up for the parent
         // HttpProxyConnectJob to use it in this method. Fail gracefully when
         // this case is encountered.
-        // TODO(https://crbug.com/1491092): Investigate whether changes are
+        // TODO(crbug.com/40284947): Investigate whether changes are
         // needed to support making the SSL cert request info available here in
         // the case described above. Just returning `result` here makes the
         // behavior for multi-proxy chains match that of single-proxy chains
diff --git a/net/http/http_request_info.h b/net/http/http_request_info.h
index 8ec196e..973bda5 100644
--- a/net/http/http_request_info.h
+++ b/net/http/http_request_info.h
@@ -93,7 +93,7 @@
   // This may the top frame origin associated with a request, or it may be the
   // top frame site.  Or it may be nullptr.  Only used for histograms.
   //
-  // TODO(https://crbug.com/1136054): Investigate migrating the one consumer of
+  // TODO(crbug.com/40724003): Investigate migrating the one consumer of
   // this to NetworkIsolationKey::TopFrameSite().  That gives more consistent
   /// behavior, and may still provide useful metrics.
   std::optional<url::Origin> possibly_top_frame_origin;
diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc
index ae67d38..1cca976 100644
--- a/net/http/http_response_headers.cc
+++ b/net/http/http_response_headers.cc
@@ -608,7 +608,7 @@
 
 void HttpResponseHeaders::Parse(const std::string& raw_input) {
   raw_headers_.reserve(raw_input.size());
-  // TODO(https://crbug.com/1470137): Call reserve() on `parsed_` with an
+  // TODO(crbug.com/40277776): Call reserve() on `parsed_` with an
   // appropriate value.
 
   // ParseStatusLine adds a normalized status line to raw_headers_
diff --git a/net/http/http_stream_factory_job_controller.cc b/net/http/http_stream_factory_job_controller.cc
index 14508ee..e66bcc9 100644
--- a/net/http/http_stream_factory_job_controller.cc
+++ b/net/http/http_stream_factory_job_controller.cc
@@ -83,7 +83,7 @@
   ProxyServer::Scheme proxy_scheme = ProxyServer::Scheme::SCHEME_INVALID;
   if (!proxy_info.is_empty() && !proxy_info.is_direct()) {
     if (proxy_info.proxy_chain().is_multi_proxy()) {
-      // TODO(https://crbug.com/1491092): Update this histogram to have a new
+      // TODO(crbug.com/40284947): Update this histogram to have a new
       // bucket for multi-chain proxies. Until then, don't influence the
       // existing metric counts which have historically been only for single-hop
       // proxies.
@@ -1390,7 +1390,8 @@
       return ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_RACE;
     }
   }
-  // TODO(crbug.com/1345536): Implement better logic to support uncovered cases.
+  // TODO(crbug.com/40232167): Implement better logic to support uncovered
+  // cases.
   return ALTERNATE_PROTOCOL_USAGE_UNSPECIFIED_REASON;
 }
 
@@ -1410,7 +1411,7 @@
   }
 
   // Clear client certificates for all proxies in the chain.
-  // TODO(https://crbug.com/1491092): client certificates for multi-proxy
+  // TODO(crbug.com/40284947): client certificates for multi-proxy
   // chains are not yet supported, and this is only tested with single-proxy
   // chains.
   for (auto& proxy_server : proxy_info_.proxy_chain().proxy_servers()) {
diff --git a/net/http/http_stream_factory_job_controller_unittest.cc b/net/http/http_stream_factory_job_controller_unittest.cc
index 801900dc..2ec4bcf 100644
--- a/net/http/http_stream_factory_job_controller_unittest.cc
+++ b/net/http/http_stream_factory_job_controller_unittest.cc
@@ -3478,7 +3478,7 @@
   EXPECT_FALSE(job_controller_->alternative_job());
 }
 
-// TODO(https://crbug.com/1007502): Disabled because the pending task count does
+// TODO(crbug.com/40649375): Disabled because the pending task count does
 //                                  not match expectations.
 TEST_P(HttpStreamFactoryJobControllerTest,
        DISABLED_ResumeMainJobImmediatelyOnStreamFailed) {
diff --git a/net/http/http_transaction.h b/net/http/http_transaction.h
index 830f7d4c..720cea1 100644
--- a/net/http/http_transaction.h
+++ b/net/http/http_transaction.h
@@ -65,10 +65,10 @@
 
   // Starts the HTTP transaction (i.e., sends the HTTP request).
   //
-  // TODO(crbug.com/723786) The consumer should ensure that request_info points
-  // to a valid value till final response headers are received; after that
-  // point, the HttpTransaction will not access |*request_info| and it may be
-  // deleted.
+  // TODO(crbug.com/40521353) The consumer should ensure that request_info
+  // points to a valid value till final response headers are received; after
+  // that point, the HttpTransaction will not access |*request_info| and it may
+  // be deleted.
   //
   // Returns OK if the transaction could be started synchronously, which means
   // that the request was served from the cache.  ERR_IO_PENDING is returned to
diff --git a/net/http/http_util.h b/net/http/http_util.h
index cd011e5c..9a584b4 100644
--- a/net/http/http_util.h
+++ b/net/http/http_util.h
@@ -201,7 +201,7 @@
   // within the headers themselves, it will be stripped. This is a workaround to
   // avoid later code from incorrectly interpreting it as a line terminator.
   //
-  // TODO(crbug.com/671799): Should remove or internalize this to
+  // TODO(crbug.com/40496844): Should remove or internalize this to
   //                         HttpResponseHeaders.
   static std::string AssembleRawHeaders(std::string_view buf);
 
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index 52531f8..d9f7422 100644
--- a/net/http/transport_security_state_static.pins
+++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@
 #   hash function for preloaded entries again (we have already done so once).
 #
 
-# Last updated: 2024-04-19 12:55 UTC
+# Last updated: 2024-04-20 12:55 UTC
 PinsListTimestamp
-1713531344
+1713617711
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json
index a0f4f19..dfdde0e 100644
--- a/net/http/transport_security_state_static_pins.json
+++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@
 // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets'
 // refer to, and the timestamp at which the pins list was last updated.
 //
-// Last updated: 2024-04-19 12:55 UTC
+// Last updated: 2024-04-20 12:55 UTC
 //
 {
   "pinsets": [
diff --git a/net/network_error_logging/network_error_logging_service.cc b/net/network_error_logging/network_error_logging_service.cc
index e546c1a..5686ce1 100644
--- a/net/network_error_logging/network_error_logging_service.cc
+++ b/net/network_error_logging/network_error_logging_service.cc
@@ -686,7 +686,7 @@
       store_->AddNelPolicy(policy);
 
     auto iter_and_result = policies_.emplace(policy.key, std::move(policy));
-    // TODO(crbug.com/1326282): Change this to a DCHECK when we're sure the bug
+    // TODO(crbug.com/40225752): Change this to a DCHECK when we're sure the bug
     // is fixed.
     CHECK(iter_and_result.second);
 
diff --git a/net/proxy_resolution/proxy_list.h b/net/proxy_resolution/proxy_list.h
index d7db976..db427c8 100644
--- a/net/proxy_resolution/proxy_list.h
+++ b/net/proxy_resolution/proxy_list.h
@@ -100,7 +100,7 @@
   // Returns a semicolon-separated list of proxy chain debug representations.
   // For single-proxy chains, this is just the PAC representation of the proxy;
   // otherwise the chain is displayed in "[..]".
-  // TODO(https://crbug.com/1491092): Once a PAC string format for multi-proxy
+  // TODO(crbug.com/40284947): Once a PAC string format for multi-proxy
   // chains is implemented, this can be removed in favor of `ToPacString()`.
   std::string ToDebugString() const;
 
diff --git a/net/quic/quic_proxy_client_socket_unittest.cc b/net/quic/quic_proxy_client_socket_unittest.cc
index 423fd67..5d41159f 100644
--- a/net/quic/quic_proxy_client_socket_unittest.cc
+++ b/net/quic/quic_proxy_client_socket_unittest.cc
@@ -192,7 +192,7 @@
 }
 
 TEST_P(QuicProxyClientSocketTest, ProxyDelegateExtraHeaders) {
-  // TODO(https://crbug.com/1491092): Add a version of this test for multi-hop.
+  // TODO(crbug.com/40284947): Add a version of this test for multi-hop.
   proxy_delegate_ = std::make_unique<TestProxyDelegate>();
   proxy_delegate_->set_extra_header_name(kTestHeaderName);
   // TODO(crbug.com/1206799) Construct `proxy_chain` with plain
diff --git a/net/reporting/reporting_cache_impl.cc b/net/reporting/reporting_cache_impl.cc
index 064616a..7674b78 100644
--- a/net/reporting/reporting_cache_impl.cc
+++ b/net/reporting/reporting_cache_impl.cc
@@ -410,7 +410,7 @@
   // Compute the total endpoint count for this origin. We can't just count the
   // number of endpoints per group because there may be duplicate endpoint URLs,
   // which we ignore. See http://crbug.com/983000 for discussion.
-  // TODO(crbug.com/983000): Allow duplicate endpoint URLs.
+  // TODO(crbug.com/40635629): Allow duplicate endpoint URLs.
   for (const auto& group_key_and_endpoint_set : endpoints_per_group) {
     new_client.endpoint_count += group_key_and_endpoint_set.second.size();
 
diff --git a/net/socket/connect_job.h b/net/socket/connect_job.h
index 32cf820..2c9c6e8f 100644
--- a/net/socket/connect_job.h
+++ b/net/socket/connect_job.h
@@ -60,7 +60,7 @@
 // ConnectJobs that wrap other ConnectJobs typically have different values for
 // those.
 struct NET_EXPORT_PRIVATE CommonConnectJobParams {
-  // TODO(https://crbug.com/1505765): Look into passing in HttpNetworkSession
+  // TODO(crbug.com/40946406): Look into passing in HttpNetworkSession
   // instead.
   CommonConnectJobParams(
       ClientSocketFactory* client_socket_factory,
diff --git a/net/socket/socket_bio_adapter_unittest.cc b/net/socket/socket_bio_adapter_unittest.cc
index 7fabbe6c..8f28e5e 100644
--- a/net/socket/socket_bio_adapter_unittest.cc
+++ b/net/socket/socket_bio_adapter_unittest.cc
@@ -286,7 +286,7 @@
 
 #if BUILDFLAG(IS_ANDROID)
 // Test that asynchronous EOF is mapped to ERR_CONNECTION_CLOSED.
-// TODO(crbug.com/1480024): Test is flaky on Android.
+// TODO(crbug.com/40281159): Test is flaky on Android.
 #define MAYBE_ReadEOFAsync DISABLED_ReadEOFAsync
 #else
 #define MAYBE_ReadEOFAsync ReadEOFAsync
diff --git a/net/socket/udp_socket_posix.cc b/net/socket/udp_socket_posix.cc
index 828c0fbf..e50bde49 100644
--- a/net/socket/udp_socket_posix.cc
+++ b/net/socket/udp_socket_posix.cc
@@ -754,7 +754,7 @@
   }
 }
 
-// TODO(crbug.com/1491628): Because InternalRecvFromConnectedSocket() uses
+// TODO(crbug.com/40285166): Because InternalRecvFromConnectedSocket() uses
 // recvfrom() instead of recvmsg(), it cannot report received ECN marks for
 // QUIC ACK-ECN frames. It might be time to deprecate
 // experimental_recv_optimization_enabled_ if that experiment has run its
diff --git a/net/socket/udp_socket_unittest.cc b/net/socket/udp_socket_unittest.cc
index db2d7cd8..bcff822 100644
--- a/net/socket/udp_socket_unittest.cc
+++ b/net/socket/udp_socket_unittest.cc
@@ -760,8 +760,8 @@
   socket.Close();
 }
 
-// TODO(https://crbug.com/947115): failing on device on iOS 12.2.
-// TODO(https://crbug.com/1227554): flaky on Mac 11.
+// TODO(crbug.com/40620614): failing on device on iOS 12.2.
+// TODO(crbug.com/40189274): flaky on Mac 11.
 #if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_MAC)
 #define MAYBE_SharedMulticastAddress DISABLED_SharedMulticastAddress
 #else
diff --git a/net/test/test_doh_server.cc b/net/test/test_doh_server.cc
index c9f215c..1fcc217 100644
--- a/net/test/test_doh_server.cc
+++ b/net/test/test_doh_server.cc
@@ -216,7 +216,7 @@
   // For now, this server does not support configuring additional records. When
   // testing more complex HTTPS record cases, this will need to be extended.
   //
-  // TODO(crbug.com/1251204): Add SOA records to test the default TTL.
+  // TODO(crbug.com/40198298): Add SOA records to test the default TTL.
   DnsResponse response(dns_query.id(), /*is_authoritative=*/true,
                        /*answers=*/answers, /*authority_records=*/{},
                        /*additional_records=*/{}, dns_query);
diff --git a/net/tools/quic/quic_simple_client_bin.cc b/net/tools/quic/quic_simple_client_bin.cc
index 519d2ec..6e6c6998 100644
--- a/net/tools/quic/quic_simple_client_bin.cc
+++ b/net/tools/quic/quic_simple_client_bin.cc
@@ -71,7 +71,7 @@
     quic::QuicIpAddress ip_addr;
     if (!ip_addr.FromString(host_for_lookup)) {
       net::AddressList addresses;
-      // TODO(https://crbug.com/1300660) Let the caller pass in the scheme
+      // TODO(crbug.com/40216365) Let the caller pass in the scheme
       // rather than guessing "https"
       int rv = net::SynchronousHostResolver::Resolve(
           url::SchemeHostPort(url::kHttpsScheme, host_for_lookup, port),
diff --git a/net/url_request/http_with_dns_over_https_unittest.cc b/net/url_request/http_with_dns_over_https_unittest.cc
index 790aa0e..3a239b2 100644
--- a/net/url_request/http_with_dns_over_https_unittest.cc
+++ b/net/url_request/http_with_dns_over_https_unittest.cc
@@ -140,7 +140,7 @@
   URLRequestContext* context() { return request_context_.get(); }
 
   void ResetContext(SecureDnsMode mode = SecureDnsMode::kSecure) {
-    // TODO(crbug.com/1252155): Simplify this.
+    // TODO(crbug.com/40198637): Simplify this.
     HostResolver::ManagerOptions manager_options;
     // Without a DnsConfig, HostResolverManager will not use DoH, even in
     // kSecure mode. See https://crbug.com/1251715. However,
diff --git a/net/websockets/websocket_end_to_end_test.cc b/net/websockets/websocket_end_to_end_test.cc
index 0f8ae9c..e190e6ab 100644
--- a/net/websockets/websocket_end_to_end_test.cc
+++ b/net/websockets/websocket_end_to_end_test.cc
@@ -402,7 +402,7 @@
   ProxyConfig proxy_config;
   proxy_config.proxy_rules().ParseFromString(
       "https=" + proxy_server.host_port_pair().ToString());
-  // TODO(https://crbug.com/901896): Don't rely on proxying localhost.
+  // TODO(crbug.com/40600992): Don't rely on proxying localhost.
   proxy_config.proxy_rules().bypass_rules.AddRulesToSubtractImplicit();
 
   std::unique_ptr<ProxyResolutionService> proxy_resolution_service(
@@ -429,7 +429,7 @@
   ProxyConfig proxy_config;
   proxy_config.proxy_rules().ParseFromString(
       "https=" + proxy_server.host_port_pair().ToString());
-  // TODO(https://crbug.com/901896): Don't rely on proxying localhost.
+  // TODO(crbug.com/40600992): Don't rely on proxying localhost.
   proxy_config.proxy_rules().bypass_rules.AddRulesToSubtractImplicit();
 
   std::unique_ptr<ProxyResolutionService> proxy_resolution_service(
@@ -458,7 +458,7 @@
   proxy_config.proxy_rules().ParseFromString(
       "https=" + proxy_server.host_port_pair().ToString() + ";" +
       "http=" + proxy_server.host_port_pair().ToString());
-  // TODO(https://crbug.com/901896): Don't rely on proxying localhost.
+  // TODO(crbug.com/40600992): Don't rely on proxying localhost.
   proxy_config.proxy_rules().bypass_rules.AddRulesToSubtractImplicit();
 
   std::unique_ptr<ProxyResolutionService> proxy_resolution_service(
diff --git a/pdf/README.md b/pdf/README.md
index d42550ad..0f33f57 100644
--- a/pdf/README.md
+++ b/pdf/README.md
@@ -6,4 +6,4 @@
 live in `//components/pdf`, or in the embedder. All the code here should run in
 sandboxed child processes.
 
-TODO(crbug.com/1220865): Remove existing `//content` dependencies.
+TODO(crbug.com/40186598): Remove existing `//content` dependencies.
diff --git a/pdf/loader/url_loader.cc b/pdf/loader/url_loader.cc
index e18f0806..becb7cb 100644
--- a/pdf/loader/url_loader.cc
+++ b/pdf/loader/url_loader.cc
@@ -133,7 +133,7 @@
   blink_request.SetRequestDestination(
       network::mojom::RequestDestination::kEmbed);
 
-  // TODO(crbug.com/822081): Revisit whether we need universal access.
+  // TODO(crbug.com/40567141): Revisit whether we need universal access.
   blink::WebAssociatedURLLoaderOptions options;
   options.grant_universal_access = true;
   ignore_redirects_ = request.ignore_redirects;
diff --git a/pdf/paint_manager.cc b/pdf/paint_manager.cc
index 0327a8d..f5e3da45 100644
--- a/pdf/paint_manager.cc
+++ b/pdf/paint_manager.cc
@@ -217,7 +217,7 @@
           SkImageInfo::MakeN32Premul(new_size.width(), new_size.height()));
       DCHECK(surface_);
 
-      // TODO(crbug.com/1317832): Can we guarantee repainting some other way?
+      // TODO(crbug.com/40222665): Can we guarantee repainting some other way?
       client_->InvalidatePluginContainer();
 
       device_scale_ = 1.0f;
@@ -305,7 +305,7 @@
                                    SkSamplingOptions(), /*paint=*/nullptr);
   client_->UpdateSnapshot(std::move(snapshot));
 
-  // TODO(crbug.com/1403311): Complete flush synchronously.
+  // TODO(crbug.com/40251507): Complete flush synchronously.
   base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
       FROM_HERE, base::BindOnce(&PaintManager::OnFlushComplete,
                                 weak_factory_.GetWeakPtr()));
diff --git a/pdf/pdf_view_web_plugin.h b/pdf/pdf_view_web_plugin.h
index 785c410..d40422c 100644
--- a/pdf/pdf_view_web_plugin.h
+++ b/pdf/pdf_view_web_plugin.h
@@ -562,7 +562,7 @@
   // Callback to print without re-entrancy issues. The callback prevents the
   // invocation of printing in the middle of an event handler, which is risky;
   // see crbug.com/66334.
-  // TODO(crbug.com/1217012): Re-evaluate the need for a callback when parts of
+  // TODO(crbug.com/40185029): Re-evaluate the need for a callback when parts of
   // the plugin are moved off the main thread.
   void OnInvokePrintDialog();
 
diff --git a/services/accessibility/fake_service_client.cc b/services/accessibility/fake_service_client.cc
index b57e572..2b1ba06 100644
--- a/services/accessibility/fake_service_client.cc
+++ b/services/accessibility/fake_service_client.cc
@@ -115,7 +115,7 @@
 
 void FakeServiceClient::Load(const base::FilePath& path,
                              LoadCallback callback) {
-  // TODO(crbug.com/1493546): Implement file loading for
+  // TODO(crbug.com/40936729): Implement file loading for
   // FakeAccessibilityServiceClient.
 }
 
diff --git a/services/data_decoder/public/mojom/image_decoder.mojom b/services/data_decoder/public/mojom/image_decoder.mojom
index 4e2cb53..5ac30e6 100644
--- a/services/data_decoder/public/mojom/image_decoder.mojom
+++ b/services/data_decoder/public/mojom/image_decoder.mojom
@@ -16,7 +16,7 @@
 };
 
 struct AnimationFrame {
-  // TODO(https://crbug.com/838706): Cnonsider replacing individual Bitmap
+  // TODO(crbug.com/40574433): Cnonsider replacing individual Bitmap
   // structs with a new type that uses a single BigBuffer for all frame data.
   skia.mojom.InlineBitmap bitmap;
   mojo_base.mojom.TimeDelta duration;
diff --git a/services/device/serial/serial_device_enumerator_win.cc b/services/device/serial/serial_device_enumerator_win.cc
index 5326f54..a5c7dc3f 100644
--- a/services/device/serial/serial_device_enumerator_win.cc
+++ b/services/device/serial/serial_device_enumerator_win.cc
@@ -332,7 +332,7 @@
   info->path = path;
   info->device_instance_id = *instance_id;
 
-  // TODO(https://crbug.com/1015074): While the "bus reported device
+  // TODO(crbug.com/40653536): While the "bus reported device
   // description" is usually the USB product string this is still up to the
   // individual serial driver and could be equal to the "friendly name". It
   // would be more reliable to read the real USB strings here.
diff --git a/services/device/test/usb_test_gadget_impl.cc b/services/device/test/usb_test_gadget_impl.cc
index b3da77b6..bc17151 100644
--- a/services/device/test/usb_test_gadget_impl.cc
+++ b/services/device/test/usb_test_gadget_impl.cc
@@ -196,7 +196,7 @@
 
 class UsbGadgetFactory : public UsbService::Observer {
  public:
-  // TODO(crbug.com/1010491): Remove `io_task_runner` parameter.
+  // TODO(crbug.com/40101494): Remove `io_task_runner` parameter.
   UsbGadgetFactory(UsbService* usb_service,
                    scoped_refptr<base::SingleThreadTaskRunner> io_task_runner)
       : usb_service_(usb_service),
diff --git a/services/metrics/public/cpp/ukm_entry_builder_base.h b/services/metrics/public/cpp/ukm_entry_builder_base.h
index 8e2cd13..b18f129 100644
--- a/services/metrics/public/cpp/ukm_entry_builder_base.h
+++ b/services/metrics/public/cpp/ukm_entry_builder_base.h
@@ -34,7 +34,7 @@
 
  protected:
   UkmEntryBuilderBase(ukm::SourceIdObj source_id, uint64_t event_hash);
-  // TODO(crbug/873866): Remove this version once callers are migrated.
+  // TODO(crbug.com/40589246): Remove this version once callers are migrated.
   UkmEntryBuilderBase(SourceId source_id, uint64_t event_hash);
 
   // Add metric to the entry. A metric contains a metric hash and value.
diff --git a/services/metrics/public/cpp/ukm_source.h b/services/metrics/public/cpp/ukm_source.h
index d464fab..a321df2 100644
--- a/services/metrics/public/cpp/ukm_source.h
+++ b/services/metrics/public/cpp/ukm_source.h
@@ -49,7 +49,7 @@
     // - For navigation sources, this will only contain at most two elements,
     //   one for the first URL in the redirect chain and one for the final URL
     //   that committed.
-    // TODO(crbug.com/869123): This may end up containing all the URLs in the
+    // TODO(crbug.com/40587196): This may end up containing all the URLs in the
     // redirect chain for navigation sources.
     std::vector<GURL> urls;
 
diff --git a/services/metrics/public/cpp/ukm_source_id.cc b/services/metrics/public/cpp/ukm_source_id.cc
index b693d582..28920a5d 100644
--- a/services/metrics/public/cpp/ukm_source_id.cc
+++ b/services/metrics/public/cpp/ukm_source_id.cc
@@ -72,7 +72,7 @@
   // DCHECK is to restrict the usage of WEBAPK_ID, PAYMENT_APP_ID, and
   // WEB_IDENTITY_ID. These should use the specific
   // |UkmRecorder::GetSourceIdFor*() methods instead.
-  // TODO(crbug.com/1046964): Ideally we should restrict
+  // TODO(crbug.com/40671101): Ideally we should restrict
   // SourceIdObj::FromOtherId() as well.
   DCHECK(id_type != SourceIdType::WEBAPK_ID);
   DCHECK(id_type != SourceIdType::PAYMENT_APP_ID);
diff --git a/services/metrics/public/cpp/ukm_source_id.h b/services/metrics/public/cpp/ukm_source_id.h
index 91f18ea..101f739 100644
--- a/services/metrics/public/cpp/ukm_source_id.h
+++ b/services/metrics/public/cpp/ukm_source_id.h
@@ -24,8 +24,8 @@
 // NOTES ON USAGE: if only the underlying int value is required to identify a
 // Source and is used in Mojo interface, and no type conversion needs to be
 // performed, use ukm::SourceId instead.
-// TODO(crbug/1046951): migrate callers to use the public methods below then
-// remove METRICS_EXPORT on this class.
+// TODO(crbug.com/40671096): migrate callers to use the public methods below
+// then remove METRICS_EXPORT on this class.
 class METRICS_EXPORT SourceIdObj {
  public:
   enum class Type : SourceId {
diff --git a/services/network/brokered_tcp_client_socket.cc b/services/network/brokered_tcp_client_socket.cc
index 5f4b78f9..704a52c9 100644
--- a/services/network/brokered_tcp_client_socket.cc
+++ b/services/network/brokered_tcp_client_socket.cc
@@ -93,7 +93,7 @@
 
   net_log_source_.BeginEvent(net::NetLogEventType::BROKERED_CREATE_SOCKET);
 
-  // TODO(https://crbug.com/1321274): Pass in AddressFamily of single IPEndPoint
+  // TODO(crbug.com/40223835): Pass in AddressFamily of single IPEndPoint
   client_socket_factory_->BrokerCreateTcpSocket(
       addresses_.begin()->GetFamily(),
       base::BindOnce(&BrokeredTcpClientSocket::DidCompleteCreate,
diff --git a/services/network/cookie_manager.cc b/services/network/cookie_manager.cc
index c251939..60cd3989 100644
--- a/services/network/cookie_manager.cc
+++ b/services/network/cookie_manager.cc
@@ -219,13 +219,13 @@
       base::Unretained(listener_registration.get()));
 
   if (name) {
-    // TODO(https://crbug.com/1225444): Include the correct cookie partition
+    // TODO(crbug.com/40188414): Include the correct cookie partition
     // key when attaching cookie change listeners to service workers.
     listener_registration->subscription =
         cookie_store_->GetChangeDispatcher().AddCallbackForCookie(
             url, *name, std::nullopt, std::move(cookie_change_callback));
   } else {
-    // TODO(https://crbug.com/1225444): Include the correct cookie partition
+    // TODO(crbug.com/40188414): Include the correct cookie partition
     // key when attaching cookie change listeners to service workers.
     listener_registration->subscription =
         cookie_store_->GetChangeDispatcher().AddCallbackForUrl(
diff --git a/services/network/cookie_manager_unittest.cc b/services/network/cookie_manager_unittest.cc
index cea37e0..c82f26d 100644
--- a/services/network/cookie_manager_unittest.cc
+++ b/services/network/cookie_manager_unittest.cc
@@ -123,7 +123,7 @@
     return net::cookie_util::StripAccessResults(std::get<0>(future.Take()));
   }
 
-  // TODO(crbug.com/1225444): CookieManager should be able to see which cookies
+  // TODO(crbug.com/40188414): CookieManager should be able to see which cookies
   // are excluded because their partition key is not contained in the
   // key collection.
   net::CookieAccessResultList GetExcludedCookieList(
diff --git a/services/network/cors/cors_url_loader.cc b/services/network/cors/cors_url_loader.cc
index 097ed0d..00a406f 100644
--- a/services/network/cors/cors_url_loader.cc
+++ b/services/network/cors/cors_url_loader.cc
@@ -910,7 +910,7 @@
 
   if (needs_preflight.has_value() &&
       *needs_preflight == PreflightRequiredReason::kPrivateNetworkAccess) {
-    // TODO(https://crbug.com/1338439): Create a base function and clean up all
+    // TODO(crbug.com/40229602): Create a base function and clean up all
     // need_pna_permission check in the code base.
     const mojom::ClientSecurityState* state = GetClientSecurityState();
     const bool needs_pna_permission =
diff --git a/services/network/cors/cors_url_loader.h b/services/network/cors/cors_url_loader.h
index e554687..5651ec5 100644
--- a/services/network/cors/cors_url_loader.h
+++ b/services/network/cors/cors_url_loader.h
@@ -192,7 +192,7 @@
   // This is used to soft-launch Private Network Access preflights: we send
   // preflights but do not require them to succeed.
   //
-  // TODO(https://crbug.com/1268378): Remove this once preflight enforcement
+  // TODO(crbug.com/40204695): Remove this once preflight enforcement
   // is enabled.
   bool ShouldIgnorePrivateNetworkAccessErrors(
       mojom::IPAddressSpace target_address_space) const;
@@ -202,7 +202,7 @@
   // This is used to soft-launch Private Network Access preflights: we send
   // preflights but do not require them to succeed.
   //
-  // TODO(https://crbug.com/1268378): Remove this once preflight enforcement
+  // TODO(crbug.com/40204695): Remove this once preflight enforcement
   // is enabled.
   PrivateNetworkAccessPreflightBehavior
   GetPrivateNetworkAccessPreflightBehavior(
@@ -339,7 +339,7 @@
   // INVARIANT: if this is true, then
   // `ShouldIgnorePrivateNetworkAccessErrors()` is also true.
   //
-  // TODO(https://crbug.com/1268378): Remove this along with
+  // TODO(crbug.com/40204695): Remove this along with
   // `ShouldIgnorePrivateNetworkAccessErrors()`.
   bool sending_pna_only_warning_preflight_ = false;
 
diff --git a/services/network/cors/cors_url_loader_factory.cc b/services/network/cors/cors_url_loader_factory.cc
index aa8dbd82..fca7b0a 100644
--- a/services/network/cors/cors_url_loader_factory.cc
+++ b/services/network/cors/cors_url_loader_factory.cc
@@ -747,7 +747,7 @@
   // Check only when `disable_web_security_` is false because
   // PreflightControllerTest use CorsURLLoaderFactory with this flag true
   // instead of network::URLLoaderFactory.
-  // TODO(https://crbug.com/1264298): consider if we can remove this exemption.
+  // TODO(crbug.com/40203308): consider if we can remove this exemption.
   if (!disable_web_security_) {
     // `net_log_create_info` field is expected to be used within network
     // service.
diff --git a/services/network/cors/cors_url_loader_private_network_access_unittest.cc b/services/network/cors/cors_url_loader_private_network_access_unittest.cc
index e789538..413b54f3 100644
--- a/services/network/cors/cors_url_loader_private_network_access_unittest.cc
+++ b/services/network/cors/cors_url_loader_private_network_access_unittest.cc
@@ -850,7 +850,7 @@
 // Network Access. The `*PolicyWarnPreflight*` variants test what happens when
 // a preflight was attempted before noticing the private network access.
 //
-// TODO(https://crbug.com/1268378): Remove these tests once the policy is never
+// TODO(crbug.com/40204695): Remove these tests once the policy is never
 // set to `kPreflightWarn` anymore.
 
 // This test verifies that when:
diff --git a/services/network/cors/preflight_controller.cc b/services/network/cors/preflight_controller.cc
index 7ff19af..a460ec2 100644
--- a/services/network/cors/preflight_controller.cc
+++ b/services/network/cors/preflight_controller.cc
@@ -529,7 +529,7 @@
 
     // Avoid overwriting if `CheckPreflightResult()` succeeds, just in case
     // there was a PNA warning in `detected_error_status`.
-    // TODO(https://crbug.com/1268378): Simplify this by always overwriting
+    // TODO(crbug.com/40204695): Simplify this by always overwriting
     // `detected_error_status` once preflights are always enforced.
     if (check_error_status.has_value()) {
       net_error = net::ERR_FAILED;
diff --git a/services/network/cors/preflight_controller.h b/services/network/cors/preflight_controller.h
index 95e2d52..5a9a2b2 100644
--- a/services/network/cors/preflight_controller.h
+++ b/services/network/cors/preflight_controller.h
@@ -45,7 +45,7 @@
 
 // Dictates how the PreflightController should treat PNA preflights.
 //
-// TODO(https://crbug.com/1268378): Remove this once enforcement is always on.
+// TODO(crbug.com/40204695): Remove this once enforcement is always on.
 enum class PrivateNetworkAccessPreflightBehavior {
   // Enforce the presence of PNA headers for PNA preflights.
   kEnforce,
@@ -85,7 +85,7 @@
   // `net::ERR_FAILED` nor `net::OK`.
   // If `net_error` is `net::OK`, then `cors_error_status` may be non-nullopt to
   // indicate a warning-only error arose due to Private Network Access.
-  // TODO(https://crbug.com/1268378): Once PNA preflights are always enforced,
+  // TODO(crbug.com/40204695): Once PNA preflights are always enforced,
   // stop populating `cors_error_status` when `net_error` is `net::OK`.
   //
   // `has_autorization_covered_by_wildcard` is true iff the request carries an
@@ -101,7 +101,7 @@
   using WithTrustedHeaderClient =
       base::StrongAlias<class WithTrustedHeaderClientTag, bool>;
 
-  // TODO(https://crbug.com/1268378): Remove this once enforcement is always on.
+  // TODO(crbug.com/40204695): Remove this once enforcement is always on.
   using EnforcePrivateNetworkAccessHeader =
       base::StrongAlias<class EnforcePrivateNetworkAccessHeaderTag, bool>;
 
diff --git a/services/network/cors/preflight_controller_unittest.cc b/services/network/cors/preflight_controller_unittest.cc
index 37d382c..8bc0dff 100644
--- a/services/network/cors/preflight_controller_unittest.cc
+++ b/services/network/cors/preflight_controller_unittest.cc
@@ -1092,7 +1092,7 @@
             result0.error().cors_error);
 }
 
-// TODO(https://crbug.com/1455123): Add test for private network access
+// TODO(crbug.com/40272627): Add test for private network access
 // permission.
 
 }  // namespace
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index ffd9fe8..388f7b68 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -607,7 +607,7 @@
       app_status_listeners_.push_back(
           std::make_unique<NetworkContextApplicationStatusListener>());
 #endif  // BUILDFLAG(IS_ANDROID)
-      // TODO(crbug.com/1413922): Set `file_operations_factory` to support
+      // TODO(crbug.com/40255884): Set `file_operations_factory` to support
       // sandboxed network service on Android.
       shared_dictionary_manager_ = SharedDictionaryManager::CreateOnDisk(
           params_->file_paths->shared_dictionary_directory->path().Append(
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc
index c5aa0f10..02c383a 100644
--- a/services/network/network_context_unittest.cc
+++ b/services/network/network_context_unittest.cc
@@ -5801,7 +5801,7 @@
   proxy_config_set[1].url = test_server.GetURL("/echo");
   proxy_config_set[1].expected_proxy_chain = net::ProxyChain::Direct();
 
-  // TODO(https://crbug.com/1491092): Add a test case for a proxy chain with
+  // TODO(crbug.com/40284947): Add a test case for a proxy chain with
   // more than one hop.
 
   for (const auto& proxy_data : proxy_config_set) {
diff --git a/services/network/network_service_proxy_delegate.cc b/services/network/network_service_proxy_delegate.cc
index d7bc773..7decb36 100644
--- a/services/network/network_service_proxy_delegate.cc
+++ b/services/network/network_service_proxy_delegate.cc
@@ -199,7 +199,7 @@
     return false;
   }
 
-  // TODO(https://crbug.com/1491092): Support nested proxies.
+  // TODO(crbug.com/40284947): Support nested proxies.
   if (proxy_chain.is_single_proxy() &&
       RulesContainsProxy(proxy_config_->rules, proxy_chain.First())) {
     return true;
diff --git a/services/network/p2p/socket_tcp.cc b/services/network/p2p/socket_tcp.cc
index 966ed18..24f266ea 100644
--- a/services/network/p2p/socket_tcp.cc
+++ b/services/network/p2p/socket_tcp.cc
@@ -252,7 +252,7 @@
   std::vector<mojom::P2PReceivedPacketPtr> received_packets;
   received_packets.push_back(std::move(packet));
 
-  // TODO(crbug.com/1376527): Batch multiple packets in the TCP case as well.
+  // TODO(crbug.com/40243224): Batch multiple packets in the TCP case as well.
   client_->DataReceived(std::move(received_packets));
 
   delegate_->DumpPacket(data, true);
diff --git a/services/network/proxy_lookup_request.cc b/services/network/proxy_lookup_request.cc
index 7edc46f0..100e092 100644
--- a/services/network/proxy_lookup_request.cc
+++ b/services/network/proxy_lookup_request.cc
@@ -41,7 +41,7 @@
       base::BindOnce(&ProxyLookupRequest::DestroySelf, base::Unretained(this)));
   // TODO(mmenke): The NetLogWithSource() means nothing is logged. Fix that.
   //
-  // TODO(https://crbug.com/1023435): Pass along a NetworkAnonymizationKey.
+  // TODO(crbug.com/40107017): Pass along a NetworkAnonymizationKey.
   int result =
       network_context_->url_request_context()
           ->proxy_resolution_service()
diff --git a/services/network/proxy_resolving_client_socket_unittest.cc b/services/network/proxy_resolving_client_socket_unittest.cc
index ee55e22..ba1b47d 100644
--- a/services/network/proxy_resolving_client_socket_unittest.cc
+++ b/services/network/proxy_resolving_client_socket_unittest.cc
@@ -1068,7 +1068,7 @@
 
   // Configure the HTTP CONNECT to fail with `mock_error`.
   //
-  // TODO(crbug.com/1279685): Test this more accurately. Errors like
+  // TODO(crbug.com/40810987): Test this more accurately. Errors like
   // `ERR_PROXY_CONNECTION_FAILED` or `ERR_PROXY_CERTIFICATE_INVALID` are
   // surfaced in response to other errors in TCP or TLS connection setup.
   static const char kHttpConnect[] =
diff --git a/services/network/public/cpp/cors/cors_fuzzer.cc b/services/network/public/cpp/cors/cors_fuzzer.cc
index 56b091de..6d2a665 100644
--- a/services/network/public/cpp/cors/cors_fuzzer.cc
+++ b/services/network/public/cpp/cors/cors_fuzzer.cc
@@ -7,7 +7,7 @@
 #include <string>
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  // TODO(crbug.com/1375854) Add corpus so generated data is higher quality.
+  // TODO(crbug.com/40242947) Add corpus so generated data is higher quality.
   const std::string test_data(reinterpret_cast<const char*>(data), size);
   network::cors::IsCorsSafelistedHeader("accept", test_data);
   network::cors::IsCorsSafelistedHeader("accept-language", test_data);
diff --git a/services/network/public/cpp/timing_allow_origin_parser.h b/services/network/public/cpp/timing_allow_origin_parser.h
index a10bb5ed..582d3cb8 100644
--- a/services/network/public/cpp/timing_allow_origin_parser.h
+++ b/services/network/public/cpp/timing_allow_origin_parser.h
@@ -25,7 +25,7 @@
 // In an ideal world though, Blink would be able to use `URLResponseHead` as
 // well...
 //
-// TODO(https://crbug.com/1199547): Use base::StringPiece here, though this
+// TODO(crbug.com/40177882): Use base::StringPiece here, though this
 // requires fixing a lot of other plumbing.
 COMPONENT_EXPORT(NETWORK_CPP)
 mojom::TimingAllowOriginPtr ParseTimingAllowOrigin(const std::string& value);
diff --git a/services/network/public/mojom/attribution.mojom b/services/network/public/mojom/attribution.mojom
index cc56bc4..e49b5df 100644
--- a/services/network/public/mojom/attribution.mojom
+++ b/services/network/public/mojom/attribution.mojom
@@ -10,7 +10,7 @@
 // must therefore be used when creating the report.
 struct TriggerVerification {
   string token;
-  // TODO(https://crbug.com/1240405): replace with `guid` once a type-mapping exists.
+  // TODO(crbug.com/40194244): replace with `guid` once a type-mapping exists.
   string aggregatable_report_id;
 };
 
diff --git a/services/network/public/mojom/cookie_manager.mojom b/services/network/public/mojom/cookie_manager.mojom
index e42bab8..1eeaa30 100644
--- a/services/network/public/mojom/cookie_manager.mojom
+++ b/services/network/public/mojom/cookie_manager.mojom
@@ -213,7 +213,7 @@
 
 // Indicates reasons why a cookie may be excluded in a get or set
 // operation and if it should be warned about.
-// TODO(crbug.com/1310444): Improve serialization validation comments.
+// TODO(crbug.com/40219875): Improve serialization validation comments.
 struct CookieInclusionStatus {
   // Bitfield. Is defined in
   // net::CookieInclusionStatus::ExclusionReason.
diff --git a/services/network/public/mojom/cors.mojom b/services/network/public/mojom/cors.mojom
index 831c13b..ad2a207d 100644
--- a/services/network/public/mojom/cors.mojom
+++ b/services/network/public/mojom/cors.mojom
@@ -192,7 +192,7 @@
 };
 
 // Describes what happened wrt PNA preflights during a request.
-// TODO(https://crbug.com/1268378): Remove this once preflights are enforced.
+// TODO(crbug.com/40204695): Remove this once preflights are enforced.
 enum PrivateNetworkAccessPreflightResult {
   // No preflight was sent.
   kNone,
diff --git a/services/network/public/mojom/host_resolver.mojom b/services/network/public/mojom/host_resolver.mojom
index 8d4ac75..d662d48 100644
--- a/services/network/public/mojom/host_resolver.mojom
+++ b/services/network/public/mojom/host_resolver.mojom
@@ -261,7 +261,7 @@
   // Enumeration for specifying the purpose of a host resolve request.
   // These values are used for UMA. Entries should not be reordered. Keep this
   // in sync with tools/metrics/histograms/enums.xml.
-  // TODO(crbug.com/1232623): Consider adding more values if kPreconnect isn't
+  // TODO(crbug.com/40191203): Consider adding more values if kPreconnect isn't
   // a majority of the purpose of host resolve requests.
   enum Purpose {
     kUnspecified,
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom
index 9694380..e899c9c 100644
--- a/services/network/public/mojom/network_context.mojom
+++ b/services/network/public/mojom/network_context.mojom
@@ -574,7 +574,7 @@
   pending_receiver<FirstPartySetsAccessDelegate>?
       first_party_sets_access_delegate_receiver;
 
-  // TODO(crbug.com/1228178): This flag is intended to be temporary and to be
+  // TODO(crbug.com/40777535): This flag is intended to be temporary and to be
   // removed (always enabled) in the future.
   bool acam_preflight_spec_conformant = true;
 
diff --git a/services/network/public/mojom/tcp_socket.mojom b/services/network/public/mojom/tcp_socket.mojom
index 6539555..11089ef 100644
--- a/services/network/public/mojom/tcp_socket.mojom
+++ b/services/network/public/mojom/tcp_socket.mojom
@@ -54,7 +54,7 @@
   // |true| restricts incoming connections to IPv6 only; |false| allows both
   // IPv4/IPv6 connections. Leaving this value unset results in platform default
   // being applied (|true| on Windows, |false| on Posix).
-  // TODO(crbug.com/1428342): Investigate the possibility of replacing optional
+  // TODO(crbug.com/40262165): Investigate the possibility of replacing optional
   // with a platform-agnostic default.
   OptionalBool ipv6_only;
 
diff --git a/services/network/public/mojom/url_loader_completion_status.mojom b/services/network/public/mojom/url_loader_completion_status.mojom
index c2613bf6..7d0294bb 100644
--- a/services/network/public/mojom/url_loader_completion_status.mojom
+++ b/services/network/public/mojom/url_loader_completion_status.mojom
@@ -61,7 +61,7 @@
   // This is used to record metrics in the client for compatibility risk
   // analysis and rollout monitoring. See https://crbug.com/1427470.
   //
-  // TODO(https://crbug.com/1268378): Remove this once preflights are enforced.
+  // TODO(crbug.com/40204695): Remove this once preflights are enforced.
   PrivateNetworkAccessPreflightResult private_network_access_preflight_result =
       PrivateNetworkAccessPreflightResult.kNone;
 
diff --git a/services/network/public/mojom/url_request.mojom b/services/network/public/mojom/url_request.mojom
index 760593a..deb406e 100644
--- a/services/network/public/mojom/url_request.mojom
+++ b/services/network/public/mojom/url_request.mojom
@@ -540,7 +540,7 @@
 
   // Indicate the state of CompressionDictionaryTransport feature. When it is
   // true, `use-as-dictionary` response HTTP header may be processed.
-  // TODO(crbug.com/1413922): Remove this flag when we launch
+  // TODO(crbug.com/40255884): Remove this flag when we launch
   // CompressionDictionaryTransport feature.
   bool shared_dictionary_writer_enabled = false;
 
diff --git a/services/network/public/mojom/url_response_head.mojom b/services/network/public/mojom/url_response_head.mojom
index 3155375..532905f 100644
--- a/services/network/public/mojom/url_response_head.mojom
+++ b/services/network/public/mojom/url_response_head.mojom
@@ -301,7 +301,7 @@
   // when the request failed without ever returning a `URLResponseHead` to the
   // loader client.
   //
-  // TODO(https://crbug.com/1268378): Remove this once preflights are enforced.
+  // TODO(crbug.com/40204695): Remove this once preflights are enforced.
   PrivateNetworkAccessPreflightResult private_network_access_preflight_result =
       PrivateNetworkAccessPreflightResult.kNone;
 
diff --git a/services/network/shared_dictionary/shared_dictionary_constants.h b/services/network/shared_dictionary/shared_dictionary_constants.h
index 241128c..721245f 100644
--- a/services/network/shared_dictionary/shared_dictionary_constants.h
+++ b/services/network/shared_dictionary/shared_dictionary_constants.h
@@ -15,7 +15,7 @@
 
 // The max expiration time (30 days) for Origin Trial. This is used when
 // CompressionDictionaryTransport feature is disabled in the network service.
-// TODO(crbug.com/1413922): Remove this after the Origin Trial experiment.
+// TODO(crbug.com/40255884): Remove this after the Origin Trial experiment.
 constexpr base::TimeDelta kMaxExpirationForOriginTrial = base::Days(30);
 
 // The total dictionary count limit per NetworkContext.
diff --git a/services/network/shared_dictionary/shared_dictionary_manager_unittest.cc b/services/network/shared_dictionary/shared_dictionary_manager_unittest.cc
index b7888c8..e9e7aa411 100644
--- a/services/network/shared_dictionary/shared_dictionary_manager_unittest.cc
+++ b/services/network/shared_dictionary/shared_dictionary_manager_unittest.cc
@@ -702,7 +702,7 @@
     writer->Finish();
     if (GetManagerType() == TestManagerType::kOnDisk) {
       FlushCacheTasks();
-      // TODO(crbug.com/1413922): Currently `id` is not supported by the disk
+      // TODO(crbug.com/40255884): Currently `id` is not supported by the disk
       // cache backend.
       continue;
     }
@@ -792,8 +792,8 @@
     writer->Finish();
     if (GetManagerType() == TestManagerType::kOnDisk) {
       FlushCacheTasks();
-      // TODO(crbug.com/1413922): Currently `match-dest` is not supported by the
-      // disk cache backend.
+      // TODO(crbug.com/40255884): Currently `match-dest` is not supported by
+      // the disk cache backend.
       continue;
     }
     std::vector<network::mojom::SharedDictionaryInfoPtr> result =
diff --git a/services/network/tcp_connected_socket.cc b/services/network/tcp_connected_socket.cc
index aef7acb..92f1330 100644
--- a/services/network/tcp_connected_socket.cc
+++ b/services/network/tcp_connected_socket.cc
@@ -125,7 +125,7 @@
   DCHECK(!socket_);
   DCHECK(callback);
 
-  // TODO(https://crbug.com/1123197): Pass a non-null NetworkQualityEstimator.
+  // TODO(crbug.com/40146880): Pass a non-null NetworkQualityEstimator.
   net::NetworkQualityEstimator* network_quality_estimator = nullptr;
 
   std::unique_ptr<net::TransportClientSocket> socket =
diff --git a/services/network/test/test_dns_util.cc b/services/network/test/test_dns_util.cc
index 3c77b66..00be20d9 100644
--- a/services/network/test/test_dns_util.cc
+++ b/services/network/test/test_dns_util.cc
@@ -45,8 +45,8 @@
                          const std::optional<net::HostResolverEndpointResults>&>
       future;
   auto resolver = SimpleHostResolver::Create(network_context);
-  // TODO(crbug.com/1355169): Consider passing a SchemeHostPort to trigger HTTPS
-  // DNS resource record query.
+  // TODO(crbug.com/40235854): Consider passing a SchemeHostPort to trigger
+  // HTTPS DNS resource record query.
   resolver->ResolveHost(
       mojom::HostResolverHost::NewHostPortPair(host_port_pair),
       network_anonymization_key, std::move(params), future.GetCallback());
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index 46fc0cc..adaae93e 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -1460,7 +1460,7 @@
               coep_reporter_)) {
     CompleteBlockedResponse(net::ERR_BLOCKED_BY_RESPONSE, false,
                             blocked_reason);
-    // TODO(https://crbug.com/1154250):  Close the socket here.
+    // TODO(crbug.com/40054032):  Close the socket here.
     // For more details see https://crbug.com/1154250#c17.
     // Item 2 discusses redirect handling.
     //
@@ -2545,7 +2545,6 @@
     return false;
   }
 
-
   // This is gated by enable_reporting_raw_headers_ to be backwards compatible
   // with the old report_raw_headers behavior, where we wouldn't even send
   // raw_response_headers_ to the trusted browser process based devtools
@@ -2554,7 +2553,7 @@
   // Non-Authoritative-Reason, but raw_response_headers_ has something else
   // which doesn't include HSTS information. This is tested by
   // DevToolsTest.TestRawHeadersWithRedirectAndHSTS.
-  // TODO(crbug.com/1234823): Remove enable_reporting_raw_headers_
+  // TODO(crbug.com/40781698): Remove enable_reporting_raw_headers_
   const net::HttpResponseHeaders* response_headers =
       raw_response_headers_ && enable_reporting_raw_headers_
           ? raw_response_headers_.get()
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index 7c645ce4..c1d92024 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -1455,7 +1455,7 @@
   EXPECT_THAT(
       client()->completion_status().cors_error_status,
       Optional(CorsErrorStatus(mojom::CorsError::kInvalidPrivateNetworkAccess,
-                               // TODO(https://crbug.com/1279376): Expect
+                               // TODO(crbug.com/40208529): Expect
                                // `kPublic` here instead, for better debugging.
                                mojom::IPAddressSpace::kUnknown,
                                mojom::IPAddressSpace::kLocal)));
diff --git a/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc b/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc
index d362511b..9a2d5f6 100644
--- a/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc
+++ b/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc
@@ -68,7 +68,7 @@
   return base::saturated_cast<int32_t>(
       os_dump.platform_private_footprint->private_bytes / 1024);
 #else
-  // TODO(crbug.com/1506552): Implement for iOS.
+  // TODO(crbug.com/40947218): Implement for iOS.
   return 0;
 #endif
 }
diff --git a/services/service_manager/public/cpp/manifest.h b/services/service_manager/public/cpp/manifest.h
index 8f62ca2..e81b371b 100644
--- a/services/service_manager/public/cpp/manifest.h
+++ b/services/service_manager/public/cpp/manifest.h
@@ -152,7 +152,7 @@
     // if |execution_mode| is |kOutOfProcessBuiltin| or
     // |kStandaloneExecutable|.
     //
-    // TODO(https://crbug.com/915806): Make this field a
+    // TODO(crbug.com/40606841): Make this field a
     // sandbox::mojom::Sandbox enum.
     std::string sandbox_type{"utility"};
   };
diff --git a/services/tracing/public/cpp/perfetto/perfetto_tracing_backend.cc b/services/tracing/public/cpp/perfetto/perfetto_tracing_backend.cc
index bb399bb0..e8dec7d 100644
--- a/services/tracing/public/cpp/perfetto/perfetto_tracing_backend.cc
+++ b/services/tracing/public/cpp/perfetto/perfetto_tracing_backend.cc
@@ -37,7 +37,7 @@
 namespace tracing {
 namespace {
 
-// TODO(crbug.com/83907): Find a good compromise between performance and
+// TODO(crbug.com/40574593): Find a good compromise between performance and
 // data granularity (mainly relevant to running with small buffer sizes
 // when we use background tracing) on Android.
 #if BUILDFLAG(IS_ANDROID)
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h
index ecf137cb..843788d 100644
--- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h
+++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h
@@ -244,7 +244,7 @@
       aux_unwinder_factory_;
   // To differentiate b/w different unwinders used for browser main
   // thread sampling.
-  // TODO(crbug.com/1377364): Remove once we have single unwinder for browser
+  // TODO(crbug.com/40243562): Remove once we have single unwinder for browser
   // main.
   UnwinderType unwinder_type_;
 
diff --git a/services/viz/privileged/mojom/gl/info_collection_gpu_service.mojom b/services/viz/privileged/mojom/gl/info_collection_gpu_service.mojom
index 9fecdeb..b19e3a4 100644
--- a/services/viz/privileged/mojom/gl/info_collection_gpu_service.mojom
+++ b/services/viz/privileged/mojom/gl/info_collection_gpu_service.mojom
@@ -13,7 +13,7 @@
   // Returning whether DX12 are supported, and if yes, the supported feature
   // level, together with a few metrics related to the device's performance for
   // about:gpu and histogram recording purpose.
-  // TODO(crbug.com/1028263): histograms need to be recorded at browser process
+  // TODO(crbug.com/40109064): histograms need to be recorded at browser process
   // for now.
   [EnableIf=is_win]
   GetGpuSupportedDirectXVersionAndDevicePerfInfo()
diff --git a/services/viz/public/mojom/BUILD.gn b/services/viz/public/mojom/BUILD.gn
index 950e28c..b5a960b 100644
--- a/services/viz/public/mojom/BUILD.gn
+++ b/services/viz/public/mojom/BUILD.gn
@@ -632,6 +632,6 @@
     },
   ]
 
-  # TODO(crbug.com/1378708): Does this need to be public_deps vs. deps?
+  # TODO(crbug.com/40244048): Does this need to be public_deps vs. deps?
   public_deps = [ ":singleplanar_format" ]
 }
diff --git a/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom b/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom
index f795853..9e38642 100644
--- a/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom
+++ b/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom
@@ -29,7 +29,7 @@
 
   // Legacy multiplanar formats (used before Multiplanar SharedImage was
   // introduced).
-  // TODO(crbug.com/1366495): Remove these once all clients are converted to
+  // TODO(crbug.com/40239769): Remove these once all clients are converted to
   // use MultiplanarSharedImage for this use case.
   YV12_LEGACY,
   NV12_LEGACY,
diff --git a/storage/browser/file_system/file_system_operation.h b/storage/browser/file_system/file_system_operation.h
index bf37afb..8e355e8 100644
--- a/storage/browser/file_system/file_system_operation.h
+++ b/storage/browser/file_system/file_system_operation.h
@@ -285,7 +285,7 @@
   //   CopyInForeignFile and CreateDirectory on dest filesystem
   //   for cross-filesystem case.
   //
-  // TODO(crbug.com/171284): Restore directory timestamps after the Move
+  // TODO(crbug.com/40960653): Restore directory timestamps after the Move
   //                         operation.
   virtual void Move(
       const FileSystemURL& src_path,
diff --git a/storage/browser/file_system/file_system_url.cc b/storage/browser/file_system/file_system_url.cc
index 481a3cd..44d0947d 100644
--- a/storage/browser/file_system/file_system_url.cc
+++ b/storage/browser/file_system/file_system_url.cc
@@ -22,7 +22,7 @@
 namespace {
 
 bool AreSameStorageKey(const FileSystemURL& a, const FileSystemURL& b) {
-  // TODO(https://crbug.com/1396116): Make the `storage_key_` member optional.
+  // TODO(crbug.com/40249324): Make the `storage_key_` member optional.
   // This class improperly uses a StorageKey with an opaque origin to indicate a
   // lack of origin for FileSystemURLs corresponding to non-sandboxed file
   // systems. This leads to unexpected behavior when comparing two non-sandboxed
diff --git a/storage/browser/file_system/mount_points.h b/storage/browser/file_system/mount_points.h
index bd0d39b5..3428cacd4 100644
--- a/storage/browser/file_system/mount_points.h
+++ b/storage/browser/file_system/mount_points.h
@@ -57,7 +57,7 @@
   // the given mount type.
   virtual bool HandlesFileSystemMountType(FileSystemType type) const = 0;
 
-  // TODO(https://crbug.com/1240603): Determine if MountPoints::CrackURL()
+  // TODO(crbug.com/40194313): Determine if MountPoints::CrackURL()
   // and its overrides in child classes should be removed and replaced with
   // FileSystemContext::CrackURL().
   //
diff --git a/storage/browser/quota/client_usage_tracker.cc b/storage/browser/quota/client_usage_tracker.cc
index aee894b3..726b94b8 100644
--- a/storage/browser/quota/client_usage_tracker.cc
+++ b/storage/browser/quota/client_usage_tracker.cc
@@ -110,7 +110,7 @@
 
   if (delta.has_value()) {
     // Constrain `delta` to avoid negative usage values.
-    // TODO(crbug.com/463729): At least one storage API sends deltas that
+    // TODO(crbug.com/40408082): At least one storage API sends deltas that
     // result in negative total usage. The line below works around this bug.
     // Fix the bug, and remove the workaround.
     bucket_it->second += std::max(*delta, -bucket_it->second);
@@ -185,7 +185,7 @@
     int64_t usage) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // Defend against confusing inputs from clients.
-  // TODO(crbug.com/1292210): Remove this check after fixing QuotaClients.
+  // TODO(crbug.com/40213066): Remove this check after fixing QuotaClients.
   if (usage < 0)
     usage = 0;
 
@@ -251,7 +251,7 @@
 void ClientUsageTracker::OnGranted(const url::Origin& origin_url,
                                    int change_flags) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // TODO(crbug.com/1215208): Remove this conversion once the storage policy
+  // TODO(crbug.com/40184305): Remove this conversion once the storage policy
   // APIs are converted to use StorageKey instead of Origin.
   const blink::StorageKey storage_key =
       blink::StorageKey::CreateFirstParty(origin_url);
@@ -264,7 +264,7 @@
 void ClientUsageTracker::OnRevoked(const url::Origin& origin_url,
                                    int change_flags) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // TODO(crbug.com/1215208): Remove this conversion once the storage policy
+  // TODO(crbug.com/40184305): Remove this conversion once the storage policy
   // APIs are converted to use StorageKey instead of Origin.
   const blink::StorageKey storage_key =
       blink::StorageKey::CreateFirstParty(origin_url);
diff --git a/storage/browser/quota/client_usage_tracker.h b/storage/browser/quota/client_usage_tracker.h
index 20ce524e..86af3b06 100644
--- a/storage/browser/quota/client_usage_tracker.h
+++ b/storage/browser/quota/client_usage_tracker.h
@@ -123,7 +123,7 @@
                          int64_t usage);
 
   // SpecialStoragePolicy::Observer overrides.
-  // TODO(crbug.com/1215208): Migrate to use StorageKey when the StoragePolicy
+  // TODO(crbug.com/40184305): Migrate to use StorageKey when the StoragePolicy
   // is migrated to use StorageKey instead of Origin.
   void OnGranted(const url::Origin& origin_url, int change_flags) override;
   void OnRevoked(const url::Origin& origin_url, int change_flags) override;
diff --git a/storage/browser/quota/quota_manager_impl.cc b/storage/browser/quota/quota_manager_impl.cc
index c583109..d58a43d9 100644
--- a/storage/browser/quota/quota_manager_impl.cc
+++ b/storage/browser/quota/quota_manager_impl.cc
@@ -2083,8 +2083,8 @@
 
   for (auto& entry : entries) {
     StorageType type = static_cast<StorageType>(entry->type);
-    // TODO(crbug.com/1175113): Change to DCHECK once persistent type is removed
-    // from QuotaDatabase.
+    // TODO(crbug.com/40167820): Change to DCHECK once persistent type is
+    // removed from QuotaDatabase.
     if (!IsSupportedType(type)) {
       continue;
     }
@@ -2337,7 +2337,7 @@
   DCHECK_GE(total_space, 0);
   DCHECK_GE(available_space, 0);
 
-  // TODO(https://crbug.com/1059560): Figure out what 0 total_space means
+  // TODO(crbug.com/40121667): Figure out what 0 total_space means
   // and how to handle the storage pressure callback in these cases.
   if (total_space == 0) {
     return;
diff --git a/storage/browser/quota/quota_manager_impl.h b/storage/browser/quota/quota_manager_impl.h
index 73b9dbe..23eb07d 100644
--- a/storage/browser/quota/quota_manager_impl.h
+++ b/storage/browser/quota/quota_manager_impl.h
@@ -352,8 +352,9 @@
   // deletion, `callback` may be called with a kErrorAbort status.
   // TODO(estade): Consider removing the status code from `callback` as it's
   // unused outside of tests.
-  // TODO(crbug/1456643): DEPRECATED please prefer using `DeleteStorageKeyData`.
-  // This should be removed as part of `CookiesTreeModel` deprecation.
+  // TODO(crbug.com/40273188): DEPRECATED please prefer using
+  // `DeleteStorageKeyData`. This should be removed as part of
+  // `CookiesTreeModel` deprecation.
   void DeleteHostData(const std::string& host,
                       blink::mojom::StorageType type,
                       StatusCallback callback);
@@ -744,7 +745,7 @@
   // Evaluates disk statistics to identify storage pressure
   // (low disk space availability) and starts the storage
   // pressure event dispatch if appropriate.
-  // TODO(crbug.com/1088004): Implement UsageAndQuotaInfoGatherer::Completed()
+  // TODO(crbug.com/40133191): Implement UsageAndQuotaInfoGatherer::Completed()
   // to use DetermineStoragePressure().
   void DetermineStoragePressure(int64_t free_space, int64_t total_space);
 
@@ -831,7 +832,8 @@
   // Iterating over this list is almost always incorrect. Most algorithms should
   // iterate over an entry in |client_types_|.
   //
-  // TODO(crbug.com/1016065): Handle Storage Service crashes. Will likely entail
+  // TODO(crbug.com/40103974): Handle Storage Service crashes. Will likely
+  // entail
   //                          using a mojo::RemoteSet here.
   std::vector<mojo::Remote<mojom::QuotaClient>> clients_for_ownership_;
 
diff --git a/storage/browser/quota/usage_tracker.cc b/storage/browser/quota/usage_tracker.cc
index 5f02aab7..8638c80 100644
--- a/storage/browser/quota/usage_tracker.cc
+++ b/storage/browser/quota/usage_tracker.cc
@@ -308,7 +308,7 @@
     case QuotaClientType::kMediaLicense:
       // Media license data does not count against quota and should always
       // report 0 usage.
-      // TODO(crbug.com/1305441): Consider counting media license data against
+      // TODO(crbug.com/40218094): Consider counting media license data against
       // quota.
       DCHECK_EQ(total_usage, 0);
       break;
diff --git a/testing/buildbot/buildbot_json_magic_substitutions.py b/testing/buildbot/buildbot_json_magic_substitutions.py
index cdb05cc3..524df2b 100644
--- a/testing/buildbot/buildbot_json_magic_substitutions.py
+++ b/testing/buildbot/buildbot_json_magic_substitutions.py
@@ -248,7 +248,7 @@
   # These bots can't handle parallel tests. See crbug.com/1353938.
   # The load can also negatively impact WebGL tests, so reduce the number of
   # jobs there.
-  # TODO(crbug.com/1349828): Try removing the Windows/Intel special casing once
+  # TODO(crbug.com/40233910): Try removing the Windows/Intel special casing once
   # we swap which machines we're using.
   is_webgpu_cts = test_name.startswith('webgpu_cts') or test_config.get(
       'telemetry_test_name') == 'webgpu_cts'
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 2be9450..229c48b 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -5482,9 +5482,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -5494,8 +5494,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
@@ -5638,9 +5638,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -5650,8 +5650,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json
index 1d6e7fbd..de2dc6b3 100644
--- a/testing/buildbot/chromium.coverage.json
+++ b/testing/buildbot/chromium.coverage.json
@@ -19663,9 +19663,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -19675,8 +19675,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
@@ -19819,9 +19819,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -19831,8 +19831,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 43f1c65..ffbc2be 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -41837,9 +41837,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -41848,8 +41848,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
@@ -41987,9 +41987,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -41998,8 +41998,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
@@ -43336,9 +43336,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -43348,8 +43348,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
@@ -43492,9 +43492,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -43504,8 +43504,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
@@ -44817,9 +44817,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -44828,8 +44828,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
@@ -44967,9 +44967,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -44978,8 +44978,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 3c1e147..3cf912c 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -15763,12 +15763,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -15778,8 +15778,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
@@ -15939,12 +15939,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 126.0.6428.0",
+        "description": "Run with ash-chrome version 126.0.6429.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -15954,8 +15954,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v126.0.6428.0",
-              "revision": "version:126.0.6428.0"
+              "location": "lacros_version_skew_tests_v126.0.6429.0",
+              "revision": "version:126.0.6429.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/filters/chromeos.services_unittests.filter b/testing/buildbot/filters/chromeos.services_unittests.filter
index 1559dd6d..79ddb85 100644
--- a/testing/buildbot/filters/chromeos.services_unittests.filter
+++ b/testing/buildbot/filters/chromeos.services_unittests.filter
@@ -1,4 +1,4 @@
-# TODO(crbug.com/868060): Enable this.
+# TODO(crbug.com/40586826): Enable this.
 -GeolocationChromeOsWifiDataProviderTest.*
 -GeolocationServiceUnitTest.GeolocationConfig
 
diff --git a/testing/buildbot/filters/code_coverage.browser_tests.filter b/testing/buildbot/filters/code_coverage.browser_tests.filter
index fc1b26c..c5e42aa 100644
--- a/testing/buildbot/filters/code_coverage.browser_tests.filter
+++ b/testing/buildbot/filters/code_coverage.browser_tests.filter
@@ -1,4 +1,4 @@
-# TODO(crbug.com/988146): Enable this.
+# TODO(crbug.com/40637833): Enable this.
 -PasswordManagerBrowserTest.*
 -ContentScriptApiTest.ContentScriptBlobFetch
 -CredentialManagerBrowserTest.*
diff --git a/testing/buildbot/filters/fuchsia.browser_tests.filter b/testing/buildbot/filters/fuchsia.browser_tests.filter
index 8a1b5e1d..85a5031 100644
--- a/testing/buildbot/filters/fuchsia.browser_tests.filter
+++ b/testing/buildbot/filters/fuchsia.browser_tests.filter
@@ -44,7 +44,7 @@
 #     Which is: "[FAILED] Expected: ''Abbf'', but was ''''"
 -DevToolsTest.TestDispatchKeyEventShowsAutoFill
 
-# TODO(crbug.com/1265618): Unsupported keySystem
+# TODO(crbug.com/40203805): Unsupported keySystem
 -EncryptedMediaSupportedTypesExternalClearKeyTest.EncryptionScheme
 -EncryptedMediaSupportedTypesExternalClearKeyTest.Robustness
 -EncryptedMediaSupportedTypesExternalClearKeyTest.SessionType
diff --git a/testing/buildbot/filters/ios.content_browsertests.filter b/testing/buildbot/filters/ios.content_browsertests.filter
index ca0380b..163a5a2 100644
--- a/testing/buildbot/filters/ios.content_browsertests.filter
+++ b/testing/buildbot/filters/ios.content_browsertests.filter
@@ -149,22 +149,22 @@
 # implemented for IOS.
 -RenderFrameHostImplBrowserTestWithBFCacheAndViewTransition.NewContentTimeoutIsSetWhenLeavingBFCacheWithViewTransition
 
-# TODO(crbug.com/1466927): unexpected level of support for codec.
+# TODO(crbug.com/40276565): unexpected level of support for codec.
 -MediaCanPlayTypeTest.CodecSupportTest_mp4
 
 # TODO(crbug.com/1467854): This test is flaky.
 -BackForwardCacheBrowserTest.NavigateToTwoPagesOnSameSiteWithSubframes
 
-# TODO(crbug.com/1477792): This test is flaky.
+# TODO(crbug.com/40280396): This test is flaky.
 -All/DumpAccessibilityTreeTest.AccessibilitySelectList/blink
 
-# TODO(crbug.com/1482265): These consistently fail.
+# TODO(crbug.com/40281785): These consistently fail.
 -All/DumpAccessibilityTreeTest.AccessibilityInputSubmit/blink
 
 # TODO(crbug.com/325678250): This test is failing due to the line wrapping.
 -All/DumpAccessibilityTreeTest.AccessibilityInputRadioCheckboxLabel/blink
 
-# TODO(crbug.com/1459221): These WebSockets tests seem to depend on the spawned
+# TODO(crbug.com/40274214): These WebSockets tests seem to depend on the spawned
 # test server, which is not supported on iOS.
 -BackForwardCacheBrowserTestNoTestingConfig.CCNSAndWebSocketBothRecorded
 -BackForwardCacheBrowserTestWithJavaScriptDetails.BlockAndUnblockFromHTMLFile
@@ -273,7 +273,7 @@
 # TODO(crbug.com/40285557): reports the wrong width/height.
 -RenderWidgetHostFoldableCSSTest.ViewportSegmentsWorksInUAFullscreenCSS
 
-# TODO(crbug.com/1495761): Text area handle has shrunk.
+# TODO(crbug.com/40286643): Text area handle has shrunk.
 -FormControlsBrowserTest.Textarea
 
 # TODO(crbug.com/1500334): Flakily fails on the platform.
@@ -298,7 +298,7 @@
 -All/BackForwardCacheMediaTest.DoesCacheIfMediaStreamTrackUsingGetDisplayMediaEndedButDoesNotWithoutFlags/0
 -All/BackForwardCacheMediaTest.DoesCacheIfMediaStreamTrackUsingGetDisplayMediaEndedButDoesNotWithoutFlags/1
 
-# TODO(crbug.com/1504145): Fails due to incorrect line wrapping.
+# TODO(crbug.com/40944655): Fails due to incorrect line wrapping.
 -All/YieldingParserDumpAccessibilityTreeTest.AccessibilityPopoverApi/blink
 -All/DumpAccessibilityTreeTestWithIgnoredNodes.AccessibilityInputRadioCheckboxLabel/blink
 
@@ -641,3 +641,11 @@
 -WebUIImplBrowserTest.NavigateFromCrashedAboutBlank
 -WebContentsObserverBrowserTest.CookieCallbacks_Subframe
 -WebContentsObserverBrowserTest.CookieCallbacks_Subresource
+
+# TODO(crbug.com/41471694): The below tests related to the touchpad and gesture_detection
+# have been failing since https://crrev.com/c/5468600.
+-SitePerProcessHitTestBrowserTest.TouchAndGestureEventPositionChange
+-TouchpadPinchBrowserTest.TouchpadPinchChangesPageScale
+-TouchpadPinchBrowserTest.WheelListenerAllowingPinch
+-TouchpadPinchBrowserTest.WheelListenerPreventingDoubleTap
+-TouchpadPinchBrowserTest.WheelListenerPreventingPinch
diff --git a/testing/buildbot/filters/ios.ui_base_unittests.filter b/testing/buildbot/filters/ios.ui_base_unittests.filter
index cff880f2..4a67fe7 100644
--- a/testing/buildbot/filters/ios.ui_base_unittests.filter
+++ b/testing/buildbot/filters/ios.ui_base_unittests.filter
@@ -1,4 +1,11 @@
-# TODO(crbug.com/1467567): these tests started failing after bots upgraded to
+# TODO(crbug.com/40276835): these tests started failing after bots upgraded to
 # xcode 15b4 (crrev.com/c/4705014).
 -ClipboardTest/PlatformClipboardTest.BitmapWriteAndPngRead_N32_Premul
 -ClipboardTest/PlatformClipboardTest.BitmapWriteAndPngRead_N32_Premul_2x7
+
+# TODO(crbug.com/40276835): A timeout happens on these tests since
+# https://ci.chromium.org/ui/p/chromium/builders/ci/ios-blink-dbg-fyi/25367/overview
+-ClipboardTest/PlatformClipboardTest.HTMLTest
+-ClipboardTest/PlatformClipboardTest.MultiFormatTest
+-ClipboardTest/PlatformClipboardTest.TrickyHTMLTest
+-ClipboardTest/PlatformClipboardTest.WriteEverything
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 0e9c5a9..4e72162 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -3355,7 +3355,7 @@
   },
   'media_foundation_browser_tests': {
     'remove_from': [
-      # TODO(crbug.com/1445173): Enable Media Foundation browser tests on NVIDIA
+      # TODO(crbug.com/40912267): Enable Media Foundation browser tests on NVIDIA
       # gpu bots once the Windows OS supports HW secure decryption.
       'Win10 FYI x64 Debug (NVIDIA)',
       'Win10 FYI x64 Release (AMD RX 5500 XT)',
@@ -5310,14 +5310,14 @@
     ],
     'modifications': {
       'Oreo Phone Tester': {
-        # TODO(crbug.com/997362): Enable this once it's passing.
+        # TODO(crbug.com/40641956): Enable this once it's passing.
         # TODO(https://crbug.com/884413): Re-enable this once the tests are
         # either passing or there is more capacity.
         'experiment_percentage': 0,
       },
       'android-11-x86-rel': {
         'args': [
-          # TODO(crbug.com/1189746) Enable this test once the issue is fixed.
+          # TODO(crbug.com/40173842) Enable this test once the issue is fixed.
           '--gtest_filter=-org.chromium.net.NetworkChangeNotifierTest.testNetworkChangeNotifierJavaObservers',
         ],
       },
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 21e6467e..96a73d2 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -267,16 +267,16 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'identifier': 'Lacros version skew testing ash canary',
-    'description': 'Run with ash-chrome version 126.0.6428.0',
+    'description': 'Run with ash-chrome version 126.0.6429.0',
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6428.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v126.0.6429.0/test_ash_chrome',
     ],
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v126.0.6428.0',
-          'revision': 'version:126.0.6428.0',
+          'location': 'lacros_version_skew_tests_v126.0.6429.0',
+          'revision': 'version:126.0.6429.0',
         },
       ],
     },
diff --git a/testing/merge_scripts/code_coverage/merge_js_lib.py b/testing/merge_scripts/code_coverage/merge_js_lib.py
index 91d441c..3a9d8637 100644
--- a/testing/merge_scripts/code_coverage/merge_js_lib.py
+++ b/testing/merge_scripts/code_coverage/merge_js_lib.py
@@ -101,7 +101,7 @@
                          file_path)
             continue
 
-        # TODO(crbug/1373753): For now we exclude any sourcemaps that are 0
+        # TODO(crbug.com/40242180): For now we exclude any sourcemaps that are 0
         # length and also that don't begin with a data URL designation.
         if len(script_data['sourceMapURL']) == 0 or not script_data[
                 'sourceMapURL'].startswith(_SOURCEMAPPING_DATA_URL_PREFIX):
diff --git a/testing/scripts/run_performance_tests.py b/testing/scripts/run_performance_tests.py
index 1f11089..d047f10 100755
--- a/testing/scripts/run_performance_tests.py
+++ b/testing/scripts/run_performance_tests.py
@@ -302,10 +302,10 @@
 
   env = os.environ.copy()
   env['CHROME_HEADLESS'] = '1'
-  #TODO(crbug/1138988): Some gtests do not implements the unit_test_launcher.cc.
-  # As a result, they will not respect the arguments added by
-  # _generate_shard_args() and will still use the values of GTEST_SHARD_INDEX
-  # and GTEST_TOTAL_SHARDS to run part of the tests.
+  # TODO(crbug.com/40153230): Some gtests do not implements the
+  # unit_test_launcher.cc. As a result, they will not respect the arguments
+  # added by _generate_shard_args() and will still use the values of
+  # GTEST_SHARD_INDEX and GTEST_TOTAL_SHARDS to run part of the tests.
   # Removing those environment variables as a workaround.
   if command_generator._ignore_shard_env_vars:
     if 'GTEST_TOTAL_SHARDS' in env:
diff --git a/testing/scripts/run_variations_smoke_tests.py b/testing/scripts/run_variations_smoke_tests.py
index 8a4d7e2c..e10bc94 100755
--- a/testing/scripts/run_variations_smoke_tests.py
+++ b/testing/scripts/run_variations_smoke_tests.py
@@ -233,7 +233,7 @@
   chrome_options.add_argument('user-data-dir=' + user_data_dir)
   chrome_options.add_argument('log-file=' + log_file)
   chrome_options.add_argument('variations-test-seed-path=' + path_seed)
-  #TODO(crbug/1342057): Remove this line.
+  #TODO(crbug.com/40230862): Remove this line.
   chrome_options.add_argument("disable-field-trial-config")
 
   for arg in args:
diff --git a/testing/test.gni b/testing/test.gni
index afe31625..f8f763b2 100644
--- a/testing/test.gni
+++ b/testing/test.gni
@@ -699,7 +699,7 @@
     }
 
     if (is_asan) {
-      # TODO(crbug.com/1465997): Remove the extra cml segment for asan.
+      # TODO(crbug.com/40276216): Remove the extra cml segment for asan.
       _manifest_fragments +=
           [ "//build/config/fuchsia/test/asan_options.shard.test-cml" ]
     }
diff --git a/testing/unexpected_passes_common/data_types.py b/testing/unexpected_passes_common/data_types.py
index 5c723a4..46ce868f 100644
--- a/testing/unexpected_passes_common/data_types.py
+++ b/testing/unexpected_passes_common/data_types.py
@@ -589,7 +589,7 @@
                                     [FULL_PASS, PARTIAL_PASS, NEVER_PASS])
         # Handle the case of a semi-stale expectation.
         else:
-          # TODO(crbug.com/998329): Sort by pass percentage so it's easier to
+          # TODO(crbug.com/40642384): Sort by pass percentage so it's easier to
           # find problematic builders without highlighting.
           builder_map = semi_stale_dict.setdefault(
               expectation_file,
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 6c7685ab..8e4324a 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -18330,7 +18330,8 @@
     "SkiaGraphite": [
         {
             "platforms": [
-                "mac"
+                "mac",
+                "windows"
             ],
             "experiments": [
                 {
diff --git a/third_party/blink/common/custom_handlers/protocol_handler_utils.cc b/third_party/blink/common/custom_handlers/protocol_handler_utils.cc
index 2e60820..681a317 100644
--- a/third_party/blink/common/custom_handlers/protocol_handler_utils.cc
+++ b/third_party/blink/common/custom_handlers/protocol_handler_utils.cc
@@ -4,9 +4,10 @@
 
 #include "third_party/blink/public/common/custom_handlers/protocol_handler_utils.h"
 
+#include <string_view>
+
 #include "base/containers/contains.h"
 #include "base/feature_list.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "services/network/public/cpp/is_potentially_trustworthy.h"
 #include "third_party/blink/public/common/features.h"
@@ -20,7 +21,7 @@
 
 URLSyntaxErrorCode IsValidCustomHandlerURLSyntax(
     const GURL& full_url,
-    const base::StringPiece& user_url) {
+    const std::string_view& user_url) {
   // The specification requires that it is a SyntaxError if the "%s" token is
   // not present.
   int index = user_url.find(kToken);
@@ -35,7 +36,7 @@
   return URLSyntaxErrorCode::kNoError;
 }
 
-bool IsValidCustomHandlerScheme(const base::StringPiece scheme,
+bool IsValidCustomHandlerScheme(const std::string_view scheme,
                                 ProtocolHandlerSecurityLevel security_level,
                                 bool* has_custom_scheme_prefix) {
   bool allow_scheme_prefix =
diff --git a/third_party/blink/common/fenced_frame/fenced_frame_utils.cc b/third_party/blink/common/fenced_frame/fenced_frame_utils.cc
index 2a0bbec..18c6d28 100644
--- a/third_party/blink/common/fenced_frame/fenced_frame_utils.cc
+++ b/third_party/blink/common/fenced_frame/fenced_frame_utils.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/public/common/fenced_frame/fenced_frame_utils.h"
 
 #include <cstring>
+#include <string_view>
 
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/string_util.h"
@@ -32,7 +33,7 @@
   return base::StartsWith(spec, kURNUUIDprefix,
                           base::CompareCase::INSENSITIVE_ASCII) &&
          base::Uuid::ParseCaseInsensitive(
-             base::StringPiece(spec).substr(std::strlen(kURNUUIDprefix)))
+             std::string_view(spec).substr(std::strlen(kURNUUIDprefix)))
              .is_valid();
 }
 
diff --git a/third_party/blink/common/interest_group/ad_display_size_utils.cc b/third_party/blink/common/interest_group/ad_display_size_utils.cc
index d3db6f25d..cb8cb27 100644
--- a/third_party/blink/common/interest_group/ad_display_size_utils.cc
+++ b/third_party/blink/common/interest_group/ad_display_size_utils.cc
@@ -17,7 +17,7 @@
 namespace {
 
 blink::AdSize::LengthUnit ConvertUnitStringToUnitEnum(
-    const base::StringPiece input) {
+    const std::string_view input) {
   if (input == "px") {
     return blink::AdSize::LengthUnit::kPixels;
   }
@@ -60,7 +60,7 @@
 }
 
 std::tuple<double, blink::AdSize::LengthUnit> ParseAdSizeString(
-    const base::StringPiece input) {
+    const std::string_view input) {
   std::string value;
   std::string unit;
   // This regular expression is used to parse the ad size specified in
diff --git a/third_party/blink/common/loader/mime_sniffing_throttle_unittest.cc b/third_party/blink/common/loader/mime_sniffing_throttle_unittest.cc
index 88178a93..1d6d5ad7 100644
--- a/third_party/blink/common/loader/mime_sniffing_throttle_unittest.cc
+++ b/third_party/blink/common/loader/mime_sniffing_throttle_unittest.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/public/common/loader/mime_sniffing_throttle.h"
 
 #include <memory>
+#include <string_view>
 
 #include "base/functional/bind.h"
 #include "base/run_loop.h"
@@ -81,7 +82,7 @@
  public:
   // Implements blink::URLLoaderThrottle::Delegate.
   void CancelWithError(int error_code,
-                       base::StringPiece custom_reason) override {
+                       std::string_view custom_reason) override {
     NOTIMPLEMENTED();
   }
   void Resume() override {
diff --git a/third_party/blink/common/loader/mime_sniffing_url_loader.cc b/third_party/blink/common/loader/mime_sniffing_url_loader.cc
index afff3c7bb..0fbdc60 100644
--- a/third_party/blink/common/loader/mime_sniffing_url_loader.cc
+++ b/third_party/blink/common/loader/mime_sniffing_url_loader.cc
@@ -4,9 +4,10 @@
 
 #include "third_party/blink/public/common/loader/mime_sniffing_url_loader.h"
 
+#include <string_view>
+
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
-#include "base/strings/string_piece.h"
 #include "base/task/sequenced_task_runner.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "net/base/mime_sniffer.h"
@@ -225,7 +226,7 @@
   buffered_body_.resize(start_size + read_bytes);
   std::string new_type;
   bool made_final_decision = net::SniffMimeType(
-      base::StringPiece(buffered_body_.data(), buffered_body_.size()),
+      std::string_view(buffered_body_.data(), buffered_body_.size()),
       response_url_, response_head_->mime_type,
       net::ForceSniffFileUrlsForHtml::kDisabled, &new_type);
   response_head_->mime_type = new_type;
diff --git a/third_party/blink/common/loader/record_load_histograms.cc b/third_party/blink/common/loader/record_load_histograms.cc
index e516fed..fabcf03 100644
--- a/third_party/blink/common/loader/record_load_histograms.cc
+++ b/third_party/blink/common/loader/record_load_histograms.cc
@@ -6,7 +6,6 @@
 
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/strings/string_piece.h"
 #include "net/base/net_errors.h"
 #include "net/base/url_util.h"
 #include "url/gurl.h"
diff --git a/third_party/blink/common/loader/throttling_url_loader.cc b/third_party/blink/common/loader/throttling_url_loader.cc
index d2de163..b4924e7 100644
--- a/third_party/blink/common/loader/throttling_url_loader.cc
+++ b/third_party/blink/common/loader/throttling_url_loader.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/public/common/loader/throttling_url_loader.h"
 
+#include <string_view>
 #include <vector>
 
 #include "base/containers/contains.h"
@@ -11,7 +12,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/strcat.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
@@ -142,13 +142,13 @@
 
   // URLLoaderThrottle::Delegate:
   void CancelWithError(int error_code,
-                       base::StringPiece custom_reason) override {
+                       std::string_view custom_reason) override {
     CancelWithExtendedError(error_code, 0, custom_reason);
   }
 
   void CancelWithExtendedError(int error_code,
                                int extended_reason_code,
-                               base::StringPiece custom_reason) override {
+                               std::string_view custom_reason) override {
     if (!loader_)
       return;
 
@@ -874,14 +874,14 @@
 }
 
 void ThrottlingURLLoader::CancelWithError(int error_code,
-                                          base::StringPiece custom_reason) {
+                                          std::string_view custom_reason) {
   CancelWithExtendedError(error_code, 0, custom_reason);
 }
 
 void ThrottlingURLLoader::CancelWithExtendedError(
     int error_code,
     int extended_reason_code,
-    base::StringPiece custom_reason) {
+    std::string_view custom_reason) {
   if (loader_completed_)
     return;
 
@@ -1000,7 +1000,7 @@
       &ThrottlingURLLoader::OnClientConnectionError, base::Unretained(this)));
 }
 
-void ThrottlingURLLoader::DisconnectClient(base::StringPiece custom_reason) {
+void ThrottlingURLLoader::DisconnectClient(std::string_view custom_reason) {
   client_receiver_.reset();
 
   if (!custom_reason.empty()) {
diff --git a/third_party/blink/common/origin_trials/persistent_origin_trials.cc b/third_party/blink/common/origin_trials/persistent_origin_trials.cc
index d16d869..5df6109 100644
--- a/third_party/blink/common/origin_trials/persistent_origin_trials.cc
+++ b/third_party/blink/common/origin_trials/persistent_origin_trials.cc
@@ -7,14 +7,15 @@
 // since changes to it require review from security reviewers, listed in the
 // SECURITY_OWNERS file.
 
-#include "third_party/blink/public/common/origin_trials/origin_trials.h"
+#include <string_view>
 
 #include "base/containers/contains.h"
+#include "third_party/blink/public/common/origin_trials/origin_trials.h"
 
 namespace blink::origin_trials {
 
-bool IsTrialPersistentToNextResponse(base::StringPiece trial_name) {
-  static base::StringPiece const kPersistentTrials[] = {
+bool IsTrialPersistentToNextResponse(std::string_view trial_name) {
+  static std::string_view const kPersistentTrials[] = {
       // Enable the FrobulatePersistent* trials as a persistent trials for
       // tests.
       "FrobulatePersistent",
diff --git a/third_party/blink/common/origin_trials/trial_token.cc b/third_party/blink/common/origin_trials/trial_token.cc
index be1fa6c7..765a25c 100644
--- a/third_party/blink/common/origin_trials/trial_token.cc
+++ b/third_party/blink/common/origin_trials/trial_token.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 #include <optional>
+#include <string_view>
 
 #include "base/base64.h"
 #include "base/json/json_reader.h"
@@ -13,7 +14,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/numerics/byte_conversions.h"
 #include "base/strings/strcat.h"
-#include "base/strings/string_piece.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "third_party/blink/public/common/origin_trials/origin_trials.h"
@@ -68,7 +68,7 @@
 
 // static
 std::unique_ptr<TrialToken> TrialToken::From(
-    base::StringPiece token_text,
+    std::string_view token_text,
     const OriginTrialPublicKey& public_key,
     OriginTrialTokenStatus* out_status) {
   DCHECK(out_status);
@@ -111,7 +111,7 @@
 
 // static
 OriginTrialTokenStatus TrialToken::Extract(
-    base::StringPiece token_text,
+    std::string_view token_text,
     const OriginTrialPublicKey& public_key,
     std::string* out_token_payload,
     std::string* out_token_signature,
@@ -160,10 +160,10 @@
 
   // Extract the version-specific contents of the token.
   const char* token_bytes = token_contents.data();
-  base::StringPiece version_piece(token_bytes + kVersionOffset, kVersionSize);
-  base::StringPiece signature(token_bytes + kSignatureOffset, kSignatureSize);
-  base::StringPiece payload_piece(token_bytes + kPayloadLengthOffset,
-                                  kPayloadLengthSize + payload_length);
+  std::string_view version_piece(token_bytes + kVersionOffset, kVersionSize);
+  std::string_view signature(token_bytes + kSignatureOffset, kSignatureSize);
+  std::string_view payload_piece(token_bytes + kPayloadLengthOffset,
+                                 kPayloadLengthSize + payload_length);
 
   // The data which is covered by the signature is (version + length + payload).
   std::string signed_data = base::StrCat({version_piece, payload_piece});
@@ -285,7 +285,7 @@
   return origin == origin_;
 }
 
-bool TrialToken::ValidateFeatureName(base::StringPiece feature_name) const {
+bool TrialToken::ValidateFeatureName(std::string_view feature_name) const {
   return feature_name == feature_name_;
 }
 
@@ -294,7 +294,7 @@
 }
 
 // static
-bool TrialToken::ValidateSignature(base::StringPiece signature,
+bool TrialToken::ValidateSignature(std::string_view signature,
                                    const std::string& data,
                                    const OriginTrialPublicKey& public_key) {
   // Signature must be 64 bytes long.
diff --git a/third_party/blink/common/origin_trials/trial_token_unittest.cc b/third_party/blink/common/origin_trials/trial_token_unittest.cc
index 42e394ef..04594eb 100644
--- a/third_party/blink/common/origin_trials/trial_token_unittest.cc
+++ b/third_party/blink/common/origin_trials/trial_token_unittest.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/test/simple_test_clock.h"
 #include "base/time/time.h"
diff --git a/third_party/blink/common/origin_trials/trial_token_validator.cc b/third_party/blink/common/origin_trials/trial_token_validator.cc
index f5430bf..c738b6e 100644
--- a/third_party/blink/common/origin_trials/trial_token_validator.cc
+++ b/third_party/blink/common/origin_trials/trial_token_validator.cc
@@ -5,6 +5,8 @@
 #include "third_party/blink/public/common/origin_trials/trial_token_validator.h"
 
 #include <memory>
+#include <string_view>
+
 #include "base/check.h"
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
@@ -62,7 +64,7 @@
 // at |current_time| given the |trial_name|.
 // Manual completion trials add an expiry grace period, which has to be taken
 // into account to answer this question.
-bool IsTokenExpired(const base::StringPiece trial_name,
+bool IsTokenExpired(const std::string_view trial_name,
                     const base::Time token_expiry_time,
                     const base::Time current_time) {
   // Check token expiry.
@@ -90,10 +92,10 @@
 // token has not been disabled.
 OriginTrialTokenStatus ValidateTokenEnabled(
     const OriginTrialPolicy& policy,
-    const base::StringPiece trial_name,
+    const std::string_view trial_name,
     const base::Time token_expiry_time,
     const TrialToken::UsageRestriction usage_restriction,
-    const base::StringPiece token_signature,
+    const std::string_view token_signature,
     const base::Time current_time) {
   if (IsTokenExpired(trial_name, token_expiry_time, current_time))
     return OriginTrialTokenStatus::kExpired;
@@ -139,7 +141,7 @@
 }
 
 TrialTokenResult TrialTokenValidator::ValidateTokenAndTrial(
-    base::StringPiece token,
+    std::string_view token,
     const url::Origin& origin,
     base::Time current_time) const {
   return ValidateTokenAndTrialWithOriginInfo(
@@ -147,7 +149,7 @@
 }
 
 TrialTokenResult TrialTokenValidator::ValidateTokenAndTrial(
-    base::StringPiece token,
+    std::string_view token,
     const url::Origin& origin,
     base::span<const url::Origin> third_party_origins,
     base::Time current_time) const {
@@ -160,7 +162,7 @@
 }
 
 TrialTokenResult TrialTokenValidator::ValidateTokenAndTrialWithOriginInfo(
-    base::StringPiece token,
+    std::string_view token,
     const OriginInfo& origin,
     base::span<const OriginInfo> third_party_origin_info,
     base::Time current_time) const {
@@ -242,7 +244,7 @@
 }
 
 TrialTokenResult TrialTokenValidator::ValidateToken(
-    base::StringPiece token,
+    std::string_view token,
     const url::Origin& origin,
     base::Time current_time) const {
   return ValidateToken(token, origin, base::span<const url::Origin>{},
@@ -250,7 +252,7 @@
 }
 
 TrialTokenResult TrialTokenValidator::ValidateToken(
-    base::StringPiece token,
+    std::string_view token,
     const url::Origin& origin,
     base::span<const url::Origin> third_party_origins,
     base::Time current_time) const {
@@ -291,10 +293,10 @@
 }
 
 bool TrialTokenValidator::RevalidateTokenAndTrial(
-    const base::StringPiece trial_name,
+    const std::string_view trial_name,
     const base::Time token_expiry_time,
     const TrialToken::UsageRestriction usage_restriction,
-    const base::StringPiece token_signature,
+    const std::string_view token_signature,
     const base::Time current_time) const {
   OriginTrialPolicy* policy = PolicyGetter().Run();
 
@@ -311,7 +313,7 @@
 }
 
 std::vector<mojom::OriginTrialFeature>
-TrialTokenValidator::FeaturesEnabledByTrial(base::StringPiece trial_name) {
+TrialTokenValidator::FeaturesEnabledByTrial(std::string_view trial_name) {
   std::vector<mojom::OriginTrialFeature> enabled_features;
   base::span<const mojom::OriginTrialFeature> features =
       origin_trials::FeaturesForTrial(trial_name);
@@ -329,12 +331,12 @@
 }
 
 bool TrialTokenValidator::TrialEnablesFeaturesForOS(
-    base::StringPiece trial_name) {
+    std::string_view trial_name) {
   return !FeaturesEnabledByTrial(trial_name).empty();
 }
 
 bool TrialTokenValidator::RequestEnablesFeature(const net::URLRequest* request,
-                                                base::StringPiece feature_name,
+                                                std::string_view feature_name,
                                                 base::Time current_time) const {
   // TODO(mek): Possibly cache the features that are availble for request in
   // UserData associated with the request.
@@ -345,7 +347,7 @@
 bool TrialTokenValidator::RequestEnablesFeature(
     const GURL& request_url,
     const net::HttpResponseHeaders* response_headers,
-    base::StringPiece feature_name,
+    std::string_view feature_name,
     base::Time current_time) const {
   return IsTrialPossibleOnOrigin(request_url) &&
          ResponseBearsValidTokenForFeature(request_url, *response_headers,
@@ -355,7 +357,7 @@
 bool TrialTokenValidator::RequestEnablesDeprecatedFeature(
     const GURL& request_url,
     const net::HttpResponseHeaders* response_headers,
-    base::StringPiece feature_name,
+    std::string_view feature_name,
     base::Time current_time) const {
   return IsDeprecationTrialPossible() &&
          ResponseBearsValidTokenForFeature(request_url, *response_headers,
@@ -365,7 +367,7 @@
 bool TrialTokenValidator::ResponseBearsValidTokenForFeature(
     const GURL& request_url,
     const net::HttpResponseHeaders& response_headers,
-    base::StringPiece feature_name,
+    std::string_view feature_name,
     base::Time current_time) const {
   url::Origin origin = url::Origin::Create(request_url);
   size_t iter = 0;
diff --git a/third_party/blink/common/origin_trials/trial_token_validator_unittest.cc b/third_party/blink/common/origin_trials/trial_token_validator_unittest.cc
index 18c9d99..9c70822e 100644
--- a/third_party/blink/common/origin_trials/trial_token_validator_unittest.cc
+++ b/third_party/blink/common/origin_trials/trial_token_validator_unittest.cc
@@ -6,13 +6,13 @@
 
 #include <memory>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include "base/containers/flat_set.h"
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ref.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/test/simple_test_clock.h"
 #include "base/time/time.h"
@@ -295,11 +295,11 @@
       const override {
     return keys_;
   }
-  bool IsFeatureDisabled(base::StringPiece feature) const override {
+  bool IsFeatureDisabled(std::string_view feature) const override {
     return disabled_features_.count(feature) > 0;
   }
 
-  bool IsFeatureDisabledForUser(base::StringPiece feature) const override {
+  bool IsFeatureDisabledForUser(std::string_view feature) const override {
     return disabled_features_for_user_.count(std::string(feature)) > 0;
   }
 
@@ -319,7 +319,7 @@
   }
 
  protected:
-  bool IsTokenDisabled(base::StringPiece token_signature) const override {
+  bool IsTokenDisabled(std::string_view token_signature) const override {
     return disabled_tokens_.count(std::string(token_signature)) > 0;
   }
 
@@ -410,14 +410,14 @@
       : validator_(validator) {}
   virtual ~ValidateTokenWrapper() = default;
 
-  virtual TrialTokenResult Validate(base::StringPiece token,
+  virtual TrialTokenResult Validate(std::string_view token,
                                     const url::Origin& origin,
                                     base::Time timestamp) const {
     return validator_->ValidateToken(token, origin, timestamp);
   }
 
   virtual TrialTokenResult Validate(
-      base::StringPiece token,
+      std::string_view token,
       const url::Origin& origin,
       base::span<const url::Origin> script_origins,
       base::Time timestamp) const {
@@ -435,13 +435,13 @@
       : ValidateTokenWrapper(validator) {}
   ~ValidateTokenAndTrialWrapper() override = default;
 
-  TrialTokenResult Validate(base::StringPiece token,
+  TrialTokenResult Validate(std::string_view token,
                             const url::Origin& origin,
                             base::Time timestamp) const override {
     return validator_->ValidateTokenAndTrial(token, origin, timestamp);
   }
 
-  TrialTokenResult Validate(base::StringPiece token,
+  TrialTokenResult Validate(std::string_view token,
                             const url::Origin& origin,
                             base::span<const url::Origin> script_origins,
                             base::Time timestamp) const override {
@@ -457,14 +457,14 @@
       : ValidateTokenWrapper(validator) {}
   ~ValidateTokenAndTrialWithOriginInfoWrapper() override = default;
 
-  TrialTokenResult Validate(base::StringPiece token,
+  TrialTokenResult Validate(std::string_view token,
                             const url::Origin& origin,
                             base::Time timestamp) const override {
     return validator_->ValidateTokenAndTrialWithOriginInfo(
         token, TrialTokenValidator::OriginInfo(origin), {}, timestamp);
   }
 
-  TrialTokenResult Validate(base::StringPiece token,
+  TrialTokenResult Validate(std::string_view token,
                             const url::Origin& origin,
                             base::span<const url::Origin> script_origins,
                             base::Time timestamp) const override {
@@ -520,13 +520,13 @@
   ~TrialTokenValidatorEquivalenceTest() noexcept override = default;
 
   // Expose the |Validate| functions of the wrapper for shorter code in tests
-  TrialTokenResult Validate(base::StringPiece token,
+  TrialTokenResult Validate(std::string_view token,
                             const url::Origin& origin,
                             base::Time timestamp) const {
     return validator_wrapper_->Validate(token, origin, timestamp);
   }
 
-  TrialTokenResult Validate(base::StringPiece token,
+  TrialTokenResult Validate(std::string_view token,
                             const url::Origin& origin,
                             base::span<const url::Origin> script_origins,
                             base::Time timestamp) const {
diff --git a/third_party/blink/common/privacy_budget/identifiability_metric_builder_unittest.cc b/third_party/blink/common/privacy_budget/identifiability_metric_builder_unittest.cc
index 053da6e..5b74295 100644
--- a/third_party/blink/common/privacy_budget/identifiability_metric_builder_unittest.cc
+++ b/third_party/blink/common/privacy_budget/identifiability_metric_builder_unittest.cc
@@ -6,8 +6,8 @@
 
 #include <cinttypes>
 #include <limits>
+#include <string_view>
 
-#include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
@@ -171,7 +171,7 @@
   test::TestUkmRecorder recorder;
   // StringPiece() needs an explicit constructor invocation.
   IdentifiabilityMetricBuilder(ukm::SourceIdObj{})
-      .Add(kTestSurface, IdentifiableToken(base::StringPiece(kAbcd)))
+      .Add(kTestSurface, IdentifiableToken(std::string_view(kAbcd)))
       .Record(&recorder);
   EXPECT_THAT(collector, FirstMetricIs(kExpectedHashOfAbcd));
 }
diff --git a/third_party/blink/common/privacy_budget/identifiability_metrics_unittest.cc b/third_party/blink/common/privacy_budget/identifiability_metrics_unittest.cc
index 7a277d68..a5e66a01 100644
--- a/third_party/blink/common/privacy_budget/identifiability_metrics_unittest.cc
+++ b/third_party/blink/common/privacy_budget/identifiability_metrics_unittest.cc
@@ -7,7 +7,6 @@
 #include <cstdint>
 #include <vector>
 
-#include "base/strings/string_piece.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace blink {
diff --git a/third_party/blink/common/privacy_budget/identifiable_token_unittest.cc b/third_party/blink/common/privacy_budget/identifiable_token_unittest.cc
index 6317f36..40c860c7 100644
--- a/third_party/blink/common/privacy_budget/identifiable_token_unittest.cc
+++ b/third_party/blink/common/privacy_budget/identifiable_token_unittest.cc
@@ -4,7 +4,8 @@
 
 #include "third_party/blink/public/common/privacy_budget/identifiable_token.h"
 
-#include "base/strings/string_piece.h"
+#include <string_view>
+
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace blink {
@@ -101,7 +102,7 @@
 }
 
 TEST(IdentifiableTokenTest, SampleStringPiece) {
-  auto source_value = base::StringPiece("abcd");
+  auto source_value = std::string_view("abcd");
   auto expected_value = INT64_C(0xf75a3b8a1499428d);
   EXPECT_EQ(IdentifiableToken(expected_value), IdentifiableToken(source_value));
   // No implicit converter for StringPiece.
diff --git a/third_party/blink/common/service_worker/service_worker_router_rule_mojom_traits_unittest.cc b/third_party/blink/common/service_worker/service_worker_router_rule_mojom_traits_unittest.cc
index c5485c3..7f2c7124 100644
--- a/third_party/blink/common/service_worker/service_worker_router_rule_mojom_traits_unittest.cc
+++ b/third_party/blink/common/service_worker/service_worker_router_rule_mojom_traits_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/public/common/service_worker/service_worker_router_rule_mojom_traits.h"
 
+#include <string_view>
+
 #include "mojo/public/cpp/test_support/test_utils.h"
 #include "services/network/public/mojom/fetch_api.mojom-shared.h"
 #include "services/network/public/mojom/service_worker_router_info.mojom-shared.h"
@@ -38,7 +40,7 @@
       {
         auto parse_result = liburlpattern::Parse(
             "/test/*",
-            [](base::StringPiece input) { return std::string(input); });
+            [](std::string_view input) { return std::string(input); });
         ASSERT_TRUE(parse_result.ok());
         url_pattern.pathname = parse_result.value().PartList();
       }
diff --git a/third_party/blink/common/shared_storage/module_script_downloader.cc b/third_party/blink/common/shared_storage/module_script_downloader.cc
index 152afa22..d698607 100644
--- a/third_party/blink/common/shared_storage/module_script_downloader.cc
+++ b/third_party/blink/common/shared_storage/module_script_downloader.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/public/common/shared_storage/module_script_downloader.h"
 
+#include <string_view>
 #include <utility>
 
 #include "base/functional/bind.h"
@@ -62,7 +63,7 @@
 
 // Checks if `charset` is a valid charset, in lowercase ASCII. Takes `body` as
 // well, to ensure it uses the specified charset.
-bool IsAllowedCharset(base::StringPiece charset, const std::string& body) {
+bool IsAllowedCharset(std::string_view charset, const std::string& body) {
   if (charset == "utf-8" || charset.empty()) {
     return base::IsStringUTF8(body);
   } else if (charset == "us-ascii") {
@@ -91,7 +92,7 @@
       network::mojom::CredentialsMode::kSameOrigin;
   resource_request->headers.SetHeader(
       net::HttpRequestHeaders::kAccept,
-      base::StringPiece("application/javascript"));
+      std::string_view("application/javascript"));
 
   simple_url_loader_ = network::SimpleURLLoader::Create(
       std::move(resource_request), kTrafficAnnotation);
diff --git a/third_party/blink/common/shared_storage/shared_storage_utils.cc b/third_party/blink/common/shared_storage/shared_storage_utils.cc
index b43b68e0..e1bcecc 100644
--- a/third_party/blink/common/shared_storage/shared_storage_utils.cc
+++ b/third_party/blink/common/shared_storage/shared_storage_utils.cc
@@ -4,8 +4,9 @@
 
 #include "third_party/blink/public/common/shared_storage/shared_storage_utils.h"
 
+#include <string_view>
+
 #include "base/metrics/histogram_functions.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "third_party/blink/public/common/features.h"
 
@@ -54,7 +55,7 @@
          blink::features::kPrivateAggregationApiEnabledInSharedStorage.Get();
 }
 
-bool IsValidPrivateAggregationContextId(base::StringPiece context_id) {
+bool IsValidPrivateAggregationContextId(std::string_view context_id) {
   return context_id.size() <= blink::kPrivateAggregationApiContextIdMaxLength &&
          base::IsStringUTF8AllowingNoncharacters(context_id);
 }
diff --git a/third_party/blink/common/storage_key/storage_key.cc b/third_party/blink/common/storage_key/storage_key.cc
index d64a2ff..a77ff35 100644
--- a/third_party/blink/common/storage_key/storage_key.cc
+++ b/third_party/blink/common/storage_key/storage_key.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <ostream>
 #include <string>
+#include <string_view>
 #include <tuple>
 
 #include "base/feature_list.h"
@@ -49,7 +50,7 @@
 // E.x.: "^0" becomes kTopLevelSite.
 // Expects `in` to have a length of 2.
 std::optional<EncodedAttribute> DeserializeAttributeSeparator(
-    const base::StringPiece& in) {
+    const std::string_view& in) {
   DCHECK_EQ(in.size(), 2U);
   uint8_t number = in[1] - '0';
 
@@ -66,7 +67,7 @@
 // This is to indicate that there is a valid separator with both a '^' and a
 // uint8_t and some amount of encoded data. I.e.: "^09" has both a "^0" as the
 // separator and '9' as the encoded data.
-bool ValidSeparatorWithData(base::StringPiece in, size_t pos_of_caret) {
+bool ValidSeparatorWithData(std::string_view in, size_t pos_of_caret) {
   if (in.length() > pos_of_caret + 2 && in[pos_of_caret + 2] != '^')
     return true;
 
@@ -78,7 +79,7 @@
 namespace blink {
 
 // static
-std::optional<StorageKey> StorageKey::Deserialize(base::StringPiece in) {
+std::optional<StorageKey> StorageKey::Deserialize(std::string_view in) {
   // As per the Serialize() call, we have to expect one of the following
   // structures:
   // <StorageKey `key`.origin> + "/" + "^1" + <StorageKey
@@ -167,7 +168,7 @@
 
       // The origin is the portion up to, but not including, the caret
       // separator.
-      const base::StringPiece origin_substr = in.substr(0, pos_first_caret);
+      const std::string_view origin_substr = in.substr(0, pos_first_caret);
       key_origin = url::Origin::Create(GURL(origin_substr));
 
       // The origin should not be opaque and the serialization should be
@@ -178,7 +179,7 @@
 
       // The top_level_site is the portion beyond the first separator.
       int length_of_site = pos_second_caret - (pos_first_caret + 2);
-      const base::StringPiece top_level_site_substr =
+      const std::string_view top_level_site_substr =
           in.substr(pos_first_caret + 2, length_of_site);
       key_top_level_site = net::SchemefulSite(GURL(top_level_site_substr));
 
@@ -223,7 +224,7 @@
 
       // The origin is the portion up to, but not including, the caret
       // separator.
-      const base::StringPiece origin_substr = in.substr(0, pos_first_caret);
+      const std::string_view origin_substr = in.substr(0, pos_first_caret);
       key_origin = url::Origin::Create(GURL(origin_substr));
 
       // The origin should not be opaque and the serialization should be
@@ -234,7 +235,7 @@
 
       // The ancestor_chain_bit is the portion beyond the first separator.
       int raw_bit;
-      const base::StringPiece raw_bit_substr =
+      const std::string_view raw_bit_substr =
           in.substr(pos_first_caret + 2, std::string::npos);
       if (!base::StringToInt(raw_bit_substr, &raw_bit)) {
         return std::nullopt;
@@ -281,7 +282,7 @@
 
       // The origin is the portion up to, but not including, the first
       // separator.
-      const base::StringPiece origin_substr = in.substr(0, pos_first_caret);
+      const std::string_view origin_substr = in.substr(0, pos_first_caret);
       key_origin = url::Origin::Create(GURL(origin_substr));
 
       // The origin should not be opaque and the serialization should be
@@ -293,10 +294,10 @@
       // The first high 64 bits of the nonce are next, between the two
       // separators.
       int length_of_high = pos_second_caret - (pos_first_caret + 2);
-      base::StringPiece high_digits =
+      std::string_view high_digits =
           in.substr(pos_first_caret + 2, length_of_high);
       // The low 64 bits are last, after the second separator.
-      base::StringPiece low_digits = in.substr(pos_second_caret + 2);
+      std::string_view low_digits = in.substr(pos_second_caret + 2);
 
       uint64_t nonce_high = 0;
       uint64_t nonce_low = 0;
@@ -353,7 +354,7 @@
 
       // The origin is the portion up to, but not including, the first
       // separator.
-      const base::StringPiece origin_substr = in.substr(0, pos_first_caret);
+      const std::string_view origin_substr = in.substr(0, pos_first_caret);
       key_origin = url::Origin::Create(GURL(origin_substr));
 
       // The origin should not be opaque and the serialization should be
@@ -365,11 +366,11 @@
       // The first high 64 bits of the sites's nonce are next, between the first
       // separators.
       int length_of_high = pos_second_caret - (pos_first_caret + 2);
-      base::StringPiece high_digits =
+      std::string_view high_digits =
           in.substr(pos_first_caret + 2, length_of_high);
       // The low 64 bits are next, after the second separator.
       int length_of_low = pos_third_caret - (pos_second_caret + 2);
-      base::StringPiece low_digits =
+      std::string_view low_digits =
           in.substr(pos_second_caret + 2, length_of_low);
 
       uint64_t nonce_high = 0;
@@ -413,7 +414,7 @@
       }
 
       // The precursor is the rest of the input.
-      const base::StringPiece url_precursor_substr =
+      const std::string_view url_precursor_substr =
           in.substr(pos_third_caret + 2);
       const GURL url_precursor(url_precursor_substr);
       const url::SchemeHostPort tuple_precursor(url_precursor);
@@ -444,7 +445,7 @@
 
 // static
 std::optional<StorageKey> StorageKey::DeserializeForLocalStorage(
-    base::StringPiece in) {
+    std::string_view in) {
   // We have to support the local storage specific variant that lacks the
   // trailing slash.
   const url::Origin maybe_origin = url::Origin::Create(GURL(in));
diff --git a/third_party/blink/common/storage_key/storage_key_unittest.cc b/third_party/blink/common/storage_key/storage_key_unittest.cc
index 34bd7e0..134d801 100644
--- a/third_party/blink/common/storage_key/storage_key_unittest.cc
+++ b/third_party/blink/common/storage_key/storage_key_unittest.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/public/common/storage_key/storage_key.h"
 
 #include <optional>
+#include <string_view>
 #include <utility>
 
 #include "base/feature_list.h"
@@ -36,7 +37,7 @@
  protected:
   const net::SchemefulSite GetOpaqueSite(uint64_t high,
                                          uint64_t low,
-                                         base::StringPiece url_string) {
+                                         std::string_view url_string) {
     return net::SchemefulSite(url::Origin(
         url::Origin::Nonce(base::UnguessableToken::CreateForTesting(high, low)),
         url::SchemeHostPort(GURL(url_string))));
diff --git a/third_party/blink/common/thread_safe_browser_interface_broker_proxy.cc b/third_party/blink/common/thread_safe_browser_interface_broker_proxy.cc
index 507f668..81c1f95 100644
--- a/third_party/blink/common/thread_safe_browser_interface_broker_proxy.cc
+++ b/third_party/blink/common/thread_safe_browser_interface_broker_proxy.cc
@@ -4,7 +4,7 @@
 
 #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
 
-#include "base/strings/string_piece.h"
+#include <string_view>
 
 namespace blink {
 
@@ -31,7 +31,7 @@
 }
 
 bool ThreadSafeBrowserInterfaceBrokerProxy::SetBinderForTesting(
-    base::StringPiece interface_name,
+    std::string_view interface_name,
     Binder binder) {
   std::string name(interface_name);
 
diff --git a/third_party/blink/common/unique_name/unique_name_helper.cc b/third_party/blink/common/unique_name/unique_name_helper.cc
index 55bafc11..88e79f7 100644
--- a/third_party/blink/common/unique_name/unique_name_helper.cc
+++ b/third_party/blink/common/unique_name/unique_name_helper.cc
@@ -5,13 +5,13 @@
 #include "third_party/blink/public/common/unique_name/unique_name_helper.h"
 
 #include <algorithm>
+#include <string_view>
 #include <utility>
 
 #include "base/check_op.h"
 #include "base/memory/raw_ptr.h"
 #include "base/notreached.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/unguessable_token.h"
 #include "crypto/sha2.h"
@@ -30,7 +30,7 @@
 
   // FrameAdapter overrides:
   bool IsMainFrame() const override { return false; }
-  bool IsCandidateUnique(base::StringPiece name) const override {
+  bool IsCandidateUnique(std::string_view name) const override {
     return parent_->IsCandidateUnique(name);
   }
   int GetSiblingCount() const override {
@@ -45,7 +45,7 @@
   }
   std::vector<std::string> CollectAncestorNames(
       BeginPoint begin_point,
-      bool (*should_stop)(base::StringPiece)) const override {
+      bool (*should_stop)(std::string_view)) const override {
     DCHECK_EQ(BeginPoint::kParentFrame, begin_point);
     return parent_->CollectAncestorNames(BeginPoint::kThisFrame, should_stop);
   }
@@ -68,7 +68,7 @@
 // exactly 80 characters.
 constexpr size_t kMaxRequestedNameSize = 80;
 
-bool IsNameWithFramePath(base::StringPiece name) {
+bool IsNameWithFramePath(std::string_view name) {
   return base::StartsWith(name, kFramePathPrefix) &&
          base::EndsWith(name, "-->") &&
          (kFramePathPrefixLength + kFramePathSuffixLength) < name.size();
@@ -146,7 +146,7 @@
 }
 
 std::string CalculateNameInternal(const FrameAdapter* frame,
-                                  base::StringPiece name) {
+                                  std::string_view name) {
   if (!name.empty() && frame->IsCandidateUnique(name) && name != "_blank")
     return std::string(name);
 
@@ -158,7 +158,7 @@
   return AppendUniqueSuffix(frame, candidate, likely_unique_suffix);
 }
 
-std::string CalculateFrameHash(base::StringPiece name) {
+std::string CalculateFrameHash(std::string_view name) {
   DCHECK_GT(name.size(), kMaxRequestedNameSize);
 
   std::string hashed_name;
@@ -170,8 +170,7 @@
   return hashed_name;
 }
 
-std::string CalculateNewName(const FrameAdapter* frame,
-                             base::StringPiece name) {
+std::string CalculateNewName(const FrameAdapter* frame, std::string_view name) {
   std::string hashed_name;
   // By default, |name| is the browsing context name, which can be arbitrarily
   // long. Since the generated name is part of history entries and FrameState,
@@ -313,7 +312,7 @@
 }
 
 std::string UniqueNameHelper::ExtractStableNameForTesting(
-    base::StringPiece unique_name) {
+    std::string_view unique_name) {
   size_t i = unique_name.rfind(kDynamicFrameMarker);
   if (i == std::string::npos)
     return std::string(unique_name);
diff --git a/third_party/blink/common/unique_name/unique_name_helper_unittest.cc b/third_party/blink/common/unique_name/unique_name_helper_unittest.cc
index 082d1907..25aa56eb 100644
--- a/third_party/blink/common/unique_name/unique_name_helper_unittest.cc
+++ b/third_party/blink/common/unique_name/unique_name_helper_unittest.cc
@@ -7,12 +7,12 @@
 #include <map>
 #include <memory>
 #include <optional>
+#include <string_view>
 #include <vector>
 
 #include "base/auto_reset.h"
 #include "base/memory/raw_ptr.h"
 #include "base/ranges/algorithm.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversions.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/page_state/page_state_serialization.h"
@@ -49,7 +49,7 @@
 
   bool IsMainFrame() const override { return !parent_; }
 
-  bool IsCandidateUnique(base::StringPiece name) const override {
+  bool IsCandidateUnique(std::string_view name) const override {
     auto* top = this;
     while (top->parent_)
       top = top->parent_;
@@ -66,7 +66,7 @@
 
   std::vector<std::string> CollectAncestorNames(
       BeginPoint begin_point,
-      bool (*should_stop)(base::StringPiece)) const override {
+      bool (*should_stop)(std::string_view)) const override {
     EXPECT_EQ(BeginPoint::kParentFrame, begin_point);
     std::vector<std::string> result;
     for (auto* adapter = parent_.get(); adapter; adapter = adapter->parent_) {
@@ -141,7 +141,7 @@
     }
   }
 
-  bool CheckUniqueness(base::StringPiece name) const {
+  bool CheckUniqueness(std::string_view name) const {
     if (name == GetNameForCurrentMode())
       return false;
     for (TestFrameAdapter* child : children_) {
diff --git a/third_party/blink/common/web_package/web_package_request_matcher.cc b/third_party/blink/common/web_package/web_package_request_matcher.cc
index 71f0bac..ab10879 100644
--- a/third_party/blink/common/web_package/web_package_request_matcher.cc
+++ b/third_party/blink/common/web_package/web_package_request_matcher.cc
@@ -7,6 +7,7 @@
 #include <limits>
 #include <memory>
 #include <optional>
+#include <string_view>
 #include <utility>
 
 #include "base/containers/contains.h"
@@ -263,7 +264,7 @@
 
 // https://tools.ietf.org/id/draft-ietf-httpbis-variants-04.html#variants
 std::optional<std::vector<std::pair<std::string, std::vector<std::string>>>>
-ParseVariants(const base::StringPiece& str) {
+ParseVariants(const std::string_view& str) {
   // Compatibility note: Draft 4 of Variants
   // (https://tools.ietf.org/id/draft-ietf-httpbis-variants-04.html#variants)
   // uses a custom format for the Variants-04 header, which this method attempts
@@ -313,7 +314,7 @@
 
 // https://tools.ietf.org/id/draft-ietf-httpbis-variants-04.html#variant-key
 std::optional<std::vector<std::vector<std::string>>> ParseVariantKey(
-    const base::StringPiece& str,
+    const std::string_view& str,
     size_t num_variant_axes) {
   // Compatibility note: Draft 4 of Variants
   // (https://tools.ietf.org/id/draft-ietf-httpbis-variants-04.html#variant-key)
diff --git a/third_party/blink/public/common/custom_handlers/protocol_handler_utils.h b/third_party/blink/public/common/custom_handlers/protocol_handler_utils.h
index 86a4240..328b043 100644
--- a/third_party/blink/public/common/custom_handlers/protocol_handler_utils.h
+++ b/third_party/blink/public/common/custom_handlers/protocol_handler_utils.h
@@ -5,7 +5,8 @@
 #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_CUSTOM_HANDLERS_PROTOCOL_HANDLER_UTILS_H_
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_CUSTOM_HANDLERS_PROTOCOL_HANDLER_UTILS_H_
 
-#include "base/strings/string_piece.h"
+#include <string_view>
+
 #include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/common/security/protocol_handler_security_level.h"
 
@@ -36,7 +37,7 @@
 // starts with a prefix indicating a custom scheme i.e. an ASCII case
 // insensitive match to the string "web+" (or alternatively "ext+" if allowed).
 bool BLINK_COMMON_EXPORT
-IsValidCustomHandlerScheme(const base::StringPiece scheme,
+IsValidCustomHandlerScheme(const std::string_view scheme,
                            ProtocolHandlerSecurityLevel security_level,
                            bool* has_custom_scheme_prefix = nullptr);
 
@@ -49,7 +50,7 @@
 // the spec states that it should throw a SyntaxError DOMException.
 URLSyntaxErrorCode BLINK_COMMON_EXPORT
 IsValidCustomHandlerURLSyntax(const GURL& full_url,
-                              const base::StringPiece& user_url);
+                              const std::string_view& user_url);
 
 // This function returns whether the specified URL is allowed as a protocol
 // handler parameter, as described in steps 6 and 7 (except same origin) of the
diff --git a/third_party/blink/public/common/interest_group/ad_display_size_utils.h b/third_party/blink/public/common/interest_group/ad_display_size_utils.h
index f9bf6a5..2a3daf0 100644
--- a/third_party/blink/public/common/interest_group/ad_display_size_utils.h
+++ b/third_party/blink/public/common/interest_group/ad_display_size_utils.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_INTEREST_GROUP_AD_DISPLAY_SIZE_UTILS_H_
 
 #include <string>
+#include <string_view>
 #include <tuple>
 
 #include "third_party/blink/public/common/common_export.h"
@@ -35,7 +36,7 @@
 // - " 25sw "
 // - "100"
 BLINK_COMMON_EXPORT std::tuple<double, blink::AdSize::LengthUnit>
-ParseAdSizeString(const base::StringPiece input);
+ParseAdSizeString(const std::string_view input);
 
 BLINK_COMMON_EXPORT bool IsValidAdSize(const blink::AdSize& size);
 
diff --git a/third_party/blink/public/common/loader/mime_sniffing_url_loader.h b/third_party/blink/public/common/loader/mime_sniffing_url_loader.h
index 0d07849..2e584ef1 100644
--- a/third_party/blink/public/common/loader/mime_sniffing_url_loader.h
+++ b/third_party/blink/public/common/loader/mime_sniffing_url_loader.h
@@ -10,7 +10,6 @@
 #include "base/functional/callback.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/strings/string_piece.h"
 #include "base/task/sequenced_task_runner.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
diff --git a/third_party/blink/public/common/loader/throttling_url_loader.h b/third_party/blink/public/common/loader/throttling_url_loader.h
index d3db7655..dca20d2a 100644
--- a/third_party/blink/public/common/loader/throttling_url_loader.h
+++ b/third_party/blink/public/common/loader/throttling_url_loader.h
@@ -7,12 +7,12 @@
 
 #include <memory>
 #include <optional>
+#include <string_view>
 
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/strings/string_piece.h"
 #include "base/time/time.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -161,11 +161,11 @@
   // datapipe endpoints.
   network::mojom::URLLoaderClientEndpointsPtr Unbind();
 
-  void CancelWithError(int error_code, base::StringPiece custom_reason);
+  void CancelWithError(int error_code, std::string_view custom_reason);
 
   void CancelWithExtendedError(int error_code,
                                int extended_reason_code,
-                               base::StringPiece custom_reason);
+                               std::string_view custom_reason);
 
   bool response_intercepted() const { return response_intercepted_; }
 
@@ -239,7 +239,7 @@
       mojo::ScopedDataPipeConsumerHandle* body);
 
   // Disconnects the client connection and releases the URLLoader.
-  void DisconnectClient(base::StringPiece custom_description);
+  void DisconnectClient(std::string_view custom_description);
 
   enum DeferredStage {
     DEFERRED_NONE,
diff --git a/third_party/blink/public/common/loader/url_loader_throttle.h b/third_party/blink/public/common/loader/url_loader_throttle.h
index 6439f294..b92d5c1e 100644
--- a/third_party/blink/public/common/loader/url_loader_throttle.h
+++ b/third_party/blink/public/common/loader/url_loader_throttle.h
@@ -6,10 +6,10 @@
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_LOADER_URL_LOADER_THROTTLE_H_
 
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include "base/memory/raw_ptr.h"
-#include "base/strings/string_piece.h"
 #include "base/types/strong_alias.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -56,14 +56,13 @@
     // Cancels the resource load with the specified error code and an optional,
     // application-defined reason description.
     virtual void CancelWithError(int error_code,
-                                 base::StringPiece custom_reason = "") = 0;
+                                 std::string_view custom_reason = "") = 0;
 
     // Cancels the resource load with the specified error code and an optional,
     // application-defined reason description with optional extended_reason().
     virtual void CancelWithExtendedError(int error_code,
                                          int extended_reason_code,
-                                         base::StringPiece custom_reason = "") {
-    }
+                                         std::string_view custom_reason = "") {}
 
     // Resumes the deferred resource load. It is a no-op if the resource load is
     // not deferred or has already been canceled.
diff --git a/third_party/blink/public/common/manifest/manifest_mojom_traits.h b/third_party/blink/public/common/manifest/manifest_mojom_traits.h
index 85165c4..b05ff81 100644
--- a/third_party/blink/public/common/manifest/manifest_mojom_traits.h
+++ b/third_party/blink/public/common/manifest/manifest_mojom_traits.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_MANIFEST_MANIFEST_MOJOM_TRAITS_H_
 
 #include <optional>
+#include <string_view>
 #include <vector>
 
 #include "base/strings/utf_string_conversions.h"
@@ -19,14 +20,14 @@
 namespace mojo {
 namespace internal {
 
-inline base::StringPiece16 TruncateString16(const std::u16string& string) {
+inline std::u16string_view TruncateString16(const std::u16string& string) {
   // We restrict the maximum length for all the strings inside the Manifest
   // when it is sent over Mojo. The renderer process truncates the strings
   // before sending the Manifest and the browser process validates that.
-  return base::StringPiece16(string).substr(0, 4 * 1024);
+  return std::u16string_view(string).substr(0, 4 * 1024);
 }
 
-inline std::optional<base::StringPiece16> TruncateOptionalString16(
+inline std::optional<std::u16string_view> TruncateOptionalString16(
     const std::optional<std::u16string>& string) {
   if (!string)
     return std::nullopt;
@@ -34,7 +35,7 @@
   return TruncateString16(*string);
 }
 
-inline std::optional<base::StringPiece16> ConvertAndTruncateOptionalString(
+inline std::optional<std::u16string_view> ConvertAndTruncateOptionalString(
     const std::optional<std::string>& string) {
   if (!string)
     return std::nullopt;
@@ -52,7 +53,7 @@
     return icon.src;
   }
 
-  static base::StringPiece16 type(
+  static std::u16string_view type(
       const ::blink::Manifest::ImageResource& icon) {
     return internal::TruncateString16(icon.type);
   }
@@ -74,17 +75,17 @@
 struct BLINK_COMMON_EXPORT
     StructTraits<blink::mojom::ManifestShortcutItemDataView,
                  ::blink::Manifest::ShortcutItem> {
-  static base::StringPiece16 name(
+  static std::u16string_view name(
       const ::blink::Manifest::ShortcutItem& shortcut) {
     return internal::TruncateString16(shortcut.name);
   }
 
-  static std::optional<base::StringPiece16> short_name(
+  static std::optional<std::u16string_view> short_name(
       const ::blink::Manifest::ShortcutItem& shortcut) {
     return internal::TruncateOptionalString16(shortcut.short_name);
   }
 
-  static std::optional<base::StringPiece16> description(
+  static std::optional<std::u16string_view> description(
       const ::blink::Manifest::ShortcutItem& shortcut) {
     return internal::TruncateOptionalString16(shortcut.description);
   }
@@ -106,7 +107,7 @@
 struct BLINK_COMMON_EXPORT
     StructTraits<blink::mojom::ManifestRelatedApplicationDataView,
                  ::blink::Manifest::RelatedApplication> {
-  static std::optional<base::StringPiece16> platform(
+  static std::optional<std::u16string_view> platform(
       const ::blink::Manifest::RelatedApplication& related_application) {
     return internal::TruncateOptionalString16(related_application.platform);
   }
@@ -116,7 +117,7 @@
     return related_application.url;
   }
 
-  static std::optional<base::StringPiece16> id(
+  static std::optional<std::u16string_view> id(
       const ::blink::Manifest::RelatedApplication& related_application) {
     return internal::TruncateOptionalString16(related_application.id);
   }
@@ -129,14 +130,14 @@
 struct BLINK_COMMON_EXPORT
     StructTraits<blink::mojom::ManifestFileFilterDataView,
                  ::blink::Manifest::FileFilter> {
-  static base::StringPiece16 name(
+  static std::u16string_view name(
       const ::blink::Manifest::FileFilter& share_target_file) {
     return internal::TruncateString16(share_target_file.name);
   }
 
-  static const std::vector<base::StringPiece16> accept(
+  static const std::vector<std::u16string_view> accept(
       const ::blink::Manifest::FileFilter& share_target_file) {
-    std::vector<base::StringPiece16> accept_types;
+    std::vector<std::u16string_view> accept_types;
 
     for (const std::u16string& accept_type : share_target_file.accept)
       accept_types.push_back(internal::TruncateString16(accept_type));
@@ -152,15 +153,15 @@
 struct BLINK_COMMON_EXPORT
     StructTraits<blink::mojom::ManifestShareTargetParamsDataView,
                  ::blink::Manifest::ShareTargetParams> {
-  static const std::optional<base::StringPiece16> text(
+  static const std::optional<std::u16string_view> text(
       const ::blink::Manifest::ShareTargetParams& share_target_params) {
     return internal::TruncateOptionalString16(share_target_params.text);
   }
-  static const std::optional<base::StringPiece16> title(
+  static const std::optional<std::u16string_view> title(
       const ::blink::Manifest::ShareTargetParams& share_target_params) {
     return internal::TruncateOptionalString16(share_target_params.title);
   }
-  static const std::optional<base::StringPiece16> url(
+  static const std::optional<std::u16string_view> url(
       const ::blink::Manifest::ShareTargetParams& share_target_params) {
     return internal::TruncateOptionalString16(share_target_params.url);
   }
@@ -214,17 +215,17 @@
 struct BLINK_COMMON_EXPORT
     StructTraits<blink::mojom::ManifestTranslationItemDataView,
                  ::blink::Manifest::TranslationItem> {
-  static std::optional<base::StringPiece16> name(
+  static std::optional<std::u16string_view> name(
       const ::blink::Manifest::TranslationItem& translation) {
     return internal::ConvertAndTruncateOptionalString(translation.name);
   }
 
-  static std::optional<base::StringPiece16> short_name(
+  static std::optional<std::u16string_view> short_name(
       const ::blink::Manifest::TranslationItem& translation) {
     return internal::ConvertAndTruncateOptionalString(translation.short_name);
   }
 
-  static std::optional<base::StringPiece16> description(
+  static std::optional<std::u16string_view> description(
       const ::blink::Manifest::TranslationItem& translation) {
     return internal::ConvertAndTruncateOptionalString(translation.description);
   }
diff --git a/third_party/blink/public/common/manifest/manifest_util.h b/third_party/blink/public/common/manifest/manifest_util.h
index 96e2c567..e92789bc 100644
--- a/third_party/blink/public/common/manifest/manifest_util.h
+++ b/third_party/blink/public/common/manifest/manifest_util.h
@@ -8,7 +8,6 @@
 #include <optional>
 #include <string>
 
-#include "base/strings/string_piece.h"
 #include "services/device/public/mojom/screen_orientation_lock_types.mojom-shared.h"
 #include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
diff --git a/third_party/blink/public/common/origin_trials/origin_trial_policy.h b/third_party/blink/public/common/origin_trials/origin_trial_policy.h
index 09d2ef4c..978b937d8 100644
--- a/third_party/blink/public/common/origin_trials/origin_trial_policy.h
+++ b/third_party/blink/public/common/origin_trials/origin_trial_policy.h
@@ -6,9 +6,9 @@
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_ORIGIN_TRIALS_ORIGIN_TRIAL_POLICY_H_
 
 #include <set>
+#include <string_view>
 #include <vector>
 
-#include "base/strings/string_piece.h"
 #include "third_party/blink/public/common/origin_trials/origin_trial_public_key.h"
 #include "url/gurl.h"
 
@@ -22,13 +22,13 @@
 
   virtual bool IsOriginTrialsSupported() const { return false; }
   virtual const std::vector<OriginTrialPublicKey>& GetPublicKeys() const = 0;
-  virtual bool IsFeatureDisabled(base::StringPiece feature) const {
+  virtual bool IsFeatureDisabled(std::string_view feature) const {
     return false;
   }
-  virtual bool IsFeatureDisabledForUser(base::StringPiece feature) const {
+  virtual bool IsFeatureDisabledForUser(std::string_view feature) const {
     return false;
   }
-  virtual bool IsTokenDisabled(base::StringPiece token_signature) const {
+  virtual bool IsTokenDisabled(std::string_view token_signature) const {
     return false;
   }
   virtual bool IsOriginSecure(const GURL& url) const { return false; }
diff --git a/third_party/blink/public/common/origin_trials/origin_trials.h b/third_party/blink/public/common/origin_trials/origin_trials.h
index 8cc1ff4..c694332 100644
--- a/third_party/blink/public/common/origin_trials/origin_trials.h
+++ b/third_party/blink/public/common/origin_trials/origin_trials.h
@@ -7,8 +7,9 @@
 #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_ORIGIN_TRIALS_ORIGIN_TRIALS_H_
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_ORIGIN_TRIALS_ORIGIN_TRIALS_H_
 
+#include <string_view>
+
 #include "base/containers/span.h"
-#include "base/strings/string_piece.h"
 #include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/mojom/origin_trial_feature/origin_trial_feature.mojom-forward.h"
 
@@ -21,28 +22,28 @@
 namespace origin_trials {
 
 // Return true if there is a feature with the passed |trial_name|.
-BLINK_COMMON_EXPORT bool IsTrialValid(base::StringPiece trial_name);
+BLINK_COMMON_EXPORT bool IsTrialValid(std::string_view trial_name);
 
 // Return true if |trial_name| can be enabled in an insecure context.
 BLINK_COMMON_EXPORT bool IsTrialEnabledForInsecureContext(
-    base::StringPiece trial_name);
+    std::string_view trial_name);
 
 // Return true if |trial_name| can be enabled from third party origins.
 BLINK_COMMON_EXPORT bool IsTrialEnabledForThirdPartyOrigins(
-    base::StringPiece trial_name);
+    std::string_view trial_name);
 
 // Return true if |trial_name| can be enabled for read access by the browser
 // process.
 BLINK_COMMON_EXPORT bool IsTrialEnabledForBrowserProcessReadAccess(
-    base::StringPiece trial_name);
+    std::string_view trial_name);
 
 // Returns true if |trial_name| should be enabled until the next response
 // from the same origin is received.
 BLINK_COMMON_EXPORT bool IsTrialPersistentToNextResponse(
-    base::StringPiece trial_name);
+    std::string_view trial_name);
 
 // Return true if |trial_name| is a deprecation trial.
-BLINK_COMMON_EXPORT bool IsDeprecationTrial(base::StringPiece trial_name);
+BLINK_COMMON_EXPORT bool IsDeprecationTrial(std::string_view trial_name);
 
 // Returns the trial type of the given |feature|.
 BLINK_COMMON_EXPORT OriginTrialType
@@ -52,7 +53,7 @@
 // The trial name MUST be valid (call IsTrialValid() before calling this
 // function).
 BLINK_COMMON_EXPORT base::span<const blink::mojom::OriginTrialFeature>
-FeaturesForTrial(base::StringPiece trial_name);
+FeaturesForTrial(std::string_view trial_name);
 
 // Return the list of features which will also be enabled if the given
 // |feature| is enabled.
diff --git a/third_party/blink/public/common/origin_trials/trial_token.h b/third_party/blink/public/common/origin_trials/trial_token.h
index 12755f4..3ec5c3399 100644
--- a/third_party/blink/public/common/origin_trials/trial_token.h
+++ b/third_party/blink/public/common/origin_trials/trial_token.h
@@ -7,8 +7,8 @@
 
 #include <memory>
 #include <string>
+#include <string_view>
 
-#include "base/strings/string_piece.h"
 #include "base/time/time.h"
 #include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/common/origin_trials/origin_trial_public_key.h"
@@ -62,7 +62,7 @@
   // correctly formatted and signed by the supplied public key, and can be
   // parsed.
   static std::unique_ptr<TrialToken> From(
-      base::StringPiece token_text,
+      std::string_view token_text,
       const OriginTrialPublicKey& public_key,
       OriginTrialTokenStatus* out_status);
 
@@ -103,7 +103,7 @@
   // parameters, respectively. Otherwise,the return code indicates what was
   // wrong with the string, and |out_token_payload|, |out_token_signature| and
   // |out_token_version| are unchanged.
-  static OriginTrialTokenStatus Extract(base::StringPiece token_text,
+  static OriginTrialTokenStatus Extract(std::string_view token_text,
                                         const OriginTrialPublicKey& public_key,
                                         std::string* out_token_payload,
                                         std::string* out_token_signature,
@@ -115,10 +115,10 @@
                                            const uint8_t version);
 
   bool ValidateOrigin(const url::Origin& origin) const;
-  bool ValidateFeatureName(base::StringPiece feature_name) const;
+  bool ValidateFeatureName(std::string_view feature_name) const;
   bool ValidateDate(const base::Time& now) const;
 
-  static bool ValidateSignature(base::StringPiece signature_text,
+  static bool ValidateSignature(std::string_view signature_text,
                                 const std::string& data,
                                 const OriginTrialPublicKey& public_key);
 
diff --git a/third_party/blink/public/common/origin_trials/trial_token_validator.h b/third_party/blink/public/common/origin_trials/trial_token_validator.h
index 1eb95de..1c4ea94 100644
--- a/third_party/blink/public/common/origin_trials/trial_token_validator.h
+++ b/third_party/blink/public/common/origin_trials/trial_token_validator.h
@@ -7,11 +7,12 @@
 
 #include <memory>
 #include <string>
+#include <string_view>
 #include <vector>
+
 #include "base/containers/flat_map.h"
 #include "base/containers/span.h"
 #include "base/functional/callback.h"
-#include "base/strings/string_piece.h"
 #include "base/time/time.h"
 #include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/common/origin_trials/trial_token.h"
@@ -64,7 +65,7 @@
                      std::vector<std::string /* token */>>;
 
   // Convenience function for non-third-party tokens.
-  virtual TrialTokenResult ValidateTokenAndTrial(base::StringPiece token,
+  virtual TrialTokenResult ValidateTokenAndTrial(std::string_view token,
                                                  const url::Origin& origin,
                                                  base::Time current_time) const;
 
@@ -78,7 +79,7 @@
   //   `third_party_origins` are checked to ensure the token is validated
   //   against a secure origin.
   virtual TrialTokenResult ValidateTokenAndTrial(
-      base::StringPiece token,
+      std::string_view token,
       const url::Origin& origin,
       base::span<const url::Origin> third_party_origins,
       base::Time current_time) const;
@@ -89,7 +90,7 @@
   // The browser process should call `ValidateTokenAndTrial` instead, which
   // takes care of the origin security evaluation internally.
   virtual TrialTokenResult ValidateTokenAndTrialWithOriginInfo(
-      base::StringPiece token,
+      std::string_view token,
       const OriginInfo& origin,
       base::span<const OriginInfo> third_party_origins,
       base::Time current_time) const;
@@ -99,7 +100,7 @@
   // the feature this token enables, the expiry time of the token and whether it
   // is a third-party token. Otherwise, only the status will be set.
   // This method is thread-safe.
-  virtual TrialTokenResult ValidateToken(base::StringPiece token,
+  virtual TrialTokenResult ValidateToken(std::string_view token,
                                          const url::Origin& origin,
                                          base::Time current_time) const;
   // Validates a token for the given `origin`. If identified as a third-party
@@ -108,7 +109,7 @@
   // empty. Returns the same result as ValidateToken() above.
   // This method is thread-safe.
   virtual TrialTokenResult ValidateToken(
-      base::StringPiece token,
+      std::string_view token,
       const url::Origin& origin,
       base::span<const url::Origin> third_party_origins,
       base::Time current_time) const;
@@ -119,28 +120,28 @@
   // ensure that it was a valid token for the origin to which we are applying
   // it.
   virtual bool RevalidateTokenAndTrial(
-      const base::StringPiece trial_name,
+      const std::string_view trial_name,
       const base::Time token_expiry_time,
       const TrialToken::UsageRestriction token_usage_restriction,
-      const base::StringPiece token_signature,
+      const std::string_view token_signature,
       const base::Time current_time) const;
 
   // Return the set of features enabled by the given `trial_name`.
   // TODO(crbug.com/1227440): Refactor this to be a part of more general
   //                          validation flows instead of a stand-alone.
   std::vector<mojom::OriginTrialFeature> FeaturesEnabledByTrial(
-      base::StringPiece trial_name);
+      std::string_view trial_name);
 
   // Return true if the trial in question enables at least one feature on the
   // current OS platform.
   // TODO(crbug.com/1227440): Refactor this to be a part of more general
   //                          validation flows instead of a stand-alone.
-  bool TrialEnablesFeaturesForOS(base::StringPiece trial_name);
+  bool TrialEnablesFeaturesForOS(std::string_view trial_name);
 
   // `request` must not be nullptr.
   // NOTE: This is not currently used, but remains here for future trials.
   bool RequestEnablesFeature(const net::URLRequest* request,
-                             base::StringPiece feature_name,
+                             std::string_view feature_name,
                              base::Time current_time) const;
 
   // Returns whether the given response for the given URL enables the named
@@ -149,7 +150,7 @@
   // `response_headers` must not be nullptr.
   bool RequestEnablesFeature(const GURL& request_url,
                              const net::HttpResponseHeaders* response_headers,
-                             base::StringPiece feature_name,
+                             std::string_view feature_name,
                              base::Time current_time) const;
 
   // Similar to `RequestEnablesFeature()`, but for Deprecation Trials that may
@@ -166,7 +167,7 @@
   bool RequestEnablesDeprecatedFeature(
       const GURL& request_url,
       const net::HttpResponseHeaders* response_headers,
-      base::StringPiece feature_name,
+      std::string_view feature_name,
       base::Time current_time) const;
 
   // Returns all valid tokens in `headers`.
@@ -194,7 +195,7 @@
   bool ResponseBearsValidTokenForFeature(
       const GURL& request_url,
       const net::HttpResponseHeaders& response_headers,
-      base::StringPiece feature_name,
+      std::string_view feature_name,
       base::Time current_time) const;
 };  // class TrialTokenValidator
 
diff --git a/third_party/blink/public/common/permissions_policy/policy_helper_public.h b/third_party/blink/public/common/permissions_policy/policy_helper_public.h
index c9d88765..a792a0d 100644
--- a/third_party/blink/public/common/permissions_policy/policy_helper_public.h
+++ b/third_party/blink/public/common/permissions_policy/policy_helper_public.h
@@ -5,18 +5,19 @@
 #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_PERMISSIONS_POLICY_POLICY_HELPER_PUBLIC_H_
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_PERMISSIONS_POLICY_POLICY_HELPER_PUBLIC_H_
 
+#include <string_view>
+
 #include "base/containers/flat_map.h"
-#include "base/strings/string_piece.h"
 #include "third_party/blink/public/common/permissions_policy/permissions_policy.h"
 #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-shared.h"
 
 namespace blink {
 
 using PermissionsPolicyFeatureToNameMap =
-    base::flat_map<mojom::PermissionsPolicyFeature, base::StringPiece>;
+    base::flat_map<mojom::PermissionsPolicyFeature, std::string_view>;
 
 using PermissionsPolicyNameToFeatureMap =
-    base::flat_map<base::StringPiece, mojom::PermissionsPolicyFeature>;
+    base::flat_map<std::string_view, mojom::PermissionsPolicyFeature>;
 
 // This method defines the feature names which will be recognized by the parser
 // for the Permissions-Policy HTTP header and the <iframe> "allow" attribute, as
diff --git a/third_party/blink/public/common/privacy_budget/identifiable_token.h b/third_party/blink/public/common/privacy_budget/identifiable_token.h
index 2ae5ffe..5c841c9 100644
--- a/third_party/blink/public/common/privacy_budget/identifiable_token.h
+++ b/third_party/blink/public/common/privacy_budget/identifiable_token.h
@@ -6,11 +6,11 @@
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_PRIVACY_BUDGET_IDENTIFIABLE_TOKEN_H_
 
 #include <cstdint>
+#include <string_view>
 #include <type_traits>
 
 #include "base/containers/span.h"
 #include "base/numerics/safe_conversions.h"
-#include "base/strings/string_piece.h"
 #include "base/template_util.h"
 #include "third_party/blink/public/common/privacy_budget/identifiability_internal_templates.h"
 #include "third_party/blink/public/common/privacy_budget/identifiability_metrics.h"
@@ -40,9 +40,9 @@
 //
 //    1. std::string -> const std::string&
 //             : lvalue -> lvalue reference + cv-qualification
-//    2. const std::string& -> base::StringPiece
+//    2. const std::string& -> std::string_view
 //             : user-defined conversion via constructor
-//               base::StringPiece(const std::string&)
+//               std::string_view(const std::string&)
 //
 // However, when used within a builder expression, the user-defined conversion
 // doesn't occur due to there not being a single user defined conversion from
@@ -148,7 +148,7 @@
   // Care must be taken when using string types with IdentifiableToken() since
   // there's not privacy expectation in the resulting token value. If the string
   // used as an input is privacy sensitive, it should not be passed in as-is.
-  explicit IdentifiableToken(base::StringPiece s)
+  explicit IdentifiableToken(std::string_view s)
       : IdentifiableToken(base::as_bytes(base::make_span(s))) {
     // The cart is before the horse, but it's a static_assert<>.
     static_assert(
diff --git a/third_party/blink/public/common/privacy_budget/identifiable_token_builder.h b/third_party/blink/public/common/privacy_budget/identifiable_token_builder.h
index f328321..d7e133c 100644
--- a/third_party/blink/public/common/privacy_budget/identifiable_token_builder.h
+++ b/third_party/blink/public/common/privacy_budget/identifiable_token_builder.h
@@ -6,9 +6,9 @@
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_PRIVACY_BUDGET_IDENTIFIABLE_TOKEN_BUILDER_H_
 
 #include <array>
+#include <string_view>
 
 #include "base/containers/span.h"
-#include "base/strings/string_piece.h"
 #include "base/template_util.h"
 #include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/common/privacy_budget/identifiability_internal_templates.h"
@@ -76,7 +76,7 @@
   // adding the contents of the buffer. Doing so will achieve the same ends as
   // AddAtomic().
   IdentifiableTokenBuilder& AddAtomic(ByteSpan buffer);
-  IdentifiableTokenBuilder& AddAtomic(base::StringPiece string) {
+  IdentifiableTokenBuilder& AddAtomic(std::string_view string) {
     return AddAtomic(base::as_bytes(base::make_span(string)));
   }
 
diff --git a/third_party/blink/public/common/safe_url_pattern_mojom_traits.h b/third_party/blink/public/common/safe_url_pattern_mojom_traits.h
index cdad823..153fb71 100644
--- a/third_party/blink/public/common/safe_url_pattern_mojom_traits.h
+++ b/third_party/blink/public/common/safe_url_pattern_mojom_traits.h
@@ -5,6 +5,8 @@
 #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_SAFE_URL_PATTERN_MOJOM_TRAITS_H_
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_SAFE_URL_PATTERN_MOJOM_TRAITS_H_
 
+#include <string_view>
+
 #include "mojo/public/cpp/bindings/struct_traits.h"
 #include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/common/safe_url_pattern.h"
@@ -14,8 +16,8 @@
 namespace mojo {
 namespace internal {
 
-inline base::StringPiece TruncateString(const std::string& string) {
-  return base::StringPiece(string).substr(0, 4 * 1024);
+inline std::string_view TruncateString(const std::string& string) {
+  return std::string_view(string).substr(0, 4 * 1024);
 }
 
 }  // namespace internal
@@ -44,7 +46,7 @@
 template <>
 struct BLINK_COMMON_EXPORT
     StructTraits<blink::mojom::FixedPatternDataView, ::liburlpattern::Part> {
-  static base::StringPiece value(const ::liburlpattern::Part& part) {
+  static std::string_view value(const ::liburlpattern::Part& part) {
     return internal::TruncateString(part.value);
   }
 
@@ -55,16 +57,16 @@
 template <>
 struct BLINK_COMMON_EXPORT
     StructTraits<blink::mojom::WildcardPatternDataView, ::liburlpattern::Part> {
-  static base::StringPiece name(const ::liburlpattern::Part& part) {
+  static std::string_view name(const ::liburlpattern::Part& part) {
     return internal::TruncateString(part.name);
   }
-  static base::StringPiece prefix(const ::liburlpattern::Part& part) {
+  static std::string_view prefix(const ::liburlpattern::Part& part) {
     return internal::TruncateString(part.prefix);
   }
-  static base::StringPiece value(const ::liburlpattern::Part& part) {
+  static std::string_view value(const ::liburlpattern::Part& part) {
     return internal::TruncateString(part.value);
   }
-  static base::StringPiece suffix(const ::liburlpattern::Part& part) {
+  static std::string_view suffix(const ::liburlpattern::Part& part) {
     return internal::TruncateString(part.suffix);
   }
 
diff --git a/third_party/blink/public/common/shared_storage/shared_storage_utils.h b/third_party/blink/public/common/shared_storage/shared_storage_utils.h
index 166eb059..e722ce63 100644
--- a/third_party/blink/public/common/shared_storage/shared_storage_utils.h
+++ b/third_party/blink/public/common/shared_storage/shared_storage_utils.h
@@ -6,8 +6,8 @@
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_SHARED_STORAGE_SHARED_STORAGE_UTILS_H_
 
 #include <cstdlib>
+#include <string_view>
 
-#include "base/strings/string_piece.h"
 #include "third_party/blink/public/common/common_export.h"
 
 namespace blink {
@@ -81,7 +81,7 @@
 
 // Whether the `context_id` is valid UTF-8 and has a valid length.
 BLINK_COMMON_EXPORT bool IsValidPrivateAggregationContextId(
-    base::StringPiece context_id);
+    std::string_view context_id);
 
 // Maximum allowed length of the context_id string.
 constexpr int kPrivateAggregationApiContextIdMaxLength = 64;
diff --git a/third_party/blink/public/common/storage_key/storage_key.h b/third_party/blink/public/common/storage_key/storage_key.h
index 57b22be2..6de0d5f 100644
--- a/third_party/blink/public/common/storage_key/storage_key.h
+++ b/third_party/blink/public/common/storage_key/storage_key.h
@@ -8,8 +8,8 @@
 #include <iosfwd>
 #include <optional>
 #include <string>
+#include <string_view>
 
-#include "base/strings/string_piece.h"
 #include "base/unguessable_token.h"
 #include "net/base/isolation_info.h"
 #include "net/base/schemeful_site.h"
@@ -161,12 +161,12 @@
   // (3D) Deserialization from string.
   // Note that if the deserialization wouldn't create a well-formed StorageKey
   // then nullopt is returned. This function must never DCHECK.
-  static std::optional<StorageKey> Deserialize(base::StringPiece in);
+  static std::optional<StorageKey> Deserialize(std::string_view in);
 
   // A variant of deserialization for localStorage code only.
   // You almost always want to use Deserialize() instead.
   static std::optional<StorageKey> DeserializeForLocalStorage(
-      base::StringPiece in);
+      std::string_view in);
 
   // (3E) Serialization to string; origin must not be opaque.
   // Note that this function will DCHECK if the origin is opaque.
diff --git a/third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h b/third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h
index 5cac0d04..34fe542 100644
--- a/third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h
+++ b/third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h
@@ -7,9 +7,9 @@
 
 #include <map>
 #include <string>
+#include <string_view>
 
 #include "base/memory/ref_counted.h"
-#include "base/strings/string_piece.h"
 #include "base/synchronization/lock.h"
 #include "mojo/public/cpp/bindings/generic_pending_receiver.h"
 #include "third_party/blink/public/common/common_export.h"
@@ -41,7 +41,7 @@
   // Binder was non-null and an existing Binder was already registered for the
   // named interface.
   using Binder = base::RepeatingCallback<void(mojo::ScopedMessagePipeHandle)>;
-  bool SetBinderForTesting(base::StringPiece interface_name, Binder);
+  bool SetBinderForTesting(std::string_view interface_name, Binder);
 
  protected:
   friend class base::RefCountedThreadSafe<
diff --git a/third_party/blink/public/common/unique_name/unique_name_helper.h b/third_party/blink/public/common/unique_name/unique_name_helper.h
index d30cb382..22cdf00 100644
--- a/third_party/blink/public/common/unique_name/unique_name_helper.h
+++ b/third_party/blink/public/common/unique_name/unique_name_helper.h
@@ -6,10 +6,10 @@
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_UNIQUE_NAME_UNIQUE_NAME_HELPER_H_
 
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include "base/memory/raw_ptr.h"
-#include "base/strings/string_piece.h"
 #include "third_party/blink/public/common/common_export.h"
 
 namespace blink {
@@ -77,7 +77,7 @@
     virtual ~FrameAdapter();
 
     virtual bool IsMainFrame() const = 0;
-    virtual bool IsCandidateUnique(base::StringPiece name) const = 0;
+    virtual bool IsCandidateUnique(std::string_view name) const = 0;
     // Returns the number of sibling frames of this frame. Note this should not
     // include this frame in the count.
     virtual int GetSiblingCount() const = 0;
@@ -100,7 +100,7 @@
     // boolean predicate that indicates when to stop collection of names.
     virtual std::vector<std::string> CollectAncestorNames(
         BeginPoint begin_point,
-        bool (*should_stop)(base::StringPiece)) const = 0;
+        bool (*should_stop)(std::string_view)) const = 0;
     // Returns a vector of ints representing the child index of each frame in
     // the chain from this frame to the root.
     virtual std::vector<int> GetFramePosition(BeginPoint begin_point) const = 0;
@@ -192,7 +192,7 @@
   //
   // Note: This method only works if |unique_name| was calculated after calling
   // PreserveStableUniqueNameForTesting (see above).
-  static std::string ExtractStableNameForTesting(base::StringPiece unique_name);
+  static std::string ExtractStableNameForTesting(std::string_view unique_name);
 
  private:
   const raw_ptr<FrameAdapter> frame_;
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index e0c5ef50..26f43e68 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -4333,6 +4333,8 @@
   kV8Translation_CanTranslate_Method = 4946,
   kV8Translation_CreateTranslator_Method = 4947,
 
+  kIdentityDigitalCredentialsDeepLink = 4948,
+
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
   // Also, run update_use_counter_feature_enum.py in
diff --git a/third_party/blink/public/platform/web_dedicated_or_shared_worker_fetch_context.h b/third_party/blink/public/platform/web_dedicated_or_shared_worker_fetch_context.h
index c3663bd..afba1584 100644
--- a/third_party/blink/public/platform/web_dedicated_or_shared_worker_fetch_context.h
+++ b/third_party/blink/public/platform/web_dedicated_or_shared_worker_fetch_context.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_DEDICATED_OR_SHARED_WORKER_FETCH_CONTEXT_H_
 
 #include <memory>
+#include <string_view>
 
 #include "base/task/single_thread_task_runner.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -99,7 +100,7 @@
   virtual void set_top_frame_origin(
       const blink::WebSecurityOrigin& top_frame_origin) = 0;
 
-  using RewriteURLFunction = WebURL (*)(base::StringPiece, bool);
+  using RewriteURLFunction = WebURL (*)(std::string_view, bool);
   static void InstallRewriteURLFunction(RewriteURLFunction rewrite_url);
 };
 
diff --git a/third_party/blink/renderer/build/scripts/templates/origin_trials.cc.tmpl b/third_party/blink/renderer/build/scripts/templates/origin_trials.cc.tmpl
index f565315..a06407a 100644
--- a/third_party/blink/renderer/build/scripts/templates/origin_trials.cc.tmpl
+++ b/third_party/blink/renderer/build/scripts/templates/origin_trials.cc.tmpl
@@ -7,6 +7,7 @@
 
 #include <array>
 #include <iterator>
+#include <string_view>
 
 #include "base/containers/contains.h"
 #include "base/ranges/algorithm.h"
@@ -37,12 +38,12 @@
 
 } // namespace
 
-bool origin_trials::IsTrialValid(base::StringPiece trial_name) {
+bool origin_trials::IsTrialValid(std::string_view trial_name) {
   return base::Contains(kTrialToFeaturesMap, trial_name,
                         &TrialToFeature::trial_name);
 }
 
-bool origin_trials::IsTrialEnabledForInsecureContext(base::StringPiece trial_name) {
+bool origin_trials::IsTrialEnabledForInsecureContext(std::string_view trial_name) {
   static const char* const kEnabledForInsecureContext[] = {
   {% for trial in origin_trial_features|selectattr('origin_trial_allows_insecure')|map(attribute='origin_trial_feature_name')|unique %}
       "{{trial}}",
@@ -51,7 +52,7 @@
   return base::Contains(kEnabledForInsecureContext, trial_name);
 }
 
-bool origin_trials::IsTrialEnabledForThirdPartyOrigins(base::StringPiece trial_name) {
+bool origin_trials::IsTrialEnabledForThirdPartyOrigins(std::string_view trial_name) {
   static const char* const kEnabledForThirdPartyOrigins[] = {
   {% for trial in origin_trial_features|selectattr('origin_trial_allows_third_party')|map(attribute='origin_trial_feature_name')|unique %}
       "{{trial}}",
@@ -60,7 +61,7 @@
   return base::Contains(kEnabledForThirdPartyOrigins, trial_name);
 }
 
-bool origin_trials::IsTrialEnabledForBrowserProcessReadAccess(base::StringPiece trial_name) {
+bool origin_trials::IsTrialEnabledForBrowserProcessReadAccess(std::string_view trial_name) {
   // Select all features that represent origin trials and have
   // browser_process_read_write_access enabled. Determine if that list of
   // features contains the  `trial_name` provided.
@@ -74,7 +75,7 @@
   return base::Contains(kEnabledForBrowserProcessReadWriteAccess, trial_name);
 }
 
-bool origin_trials::IsDeprecationTrial(base::StringPiece trial_name) {
+bool origin_trials::IsDeprecationTrial(std::string_view trial_name) {
   for (auto feature : FeaturesForTrial(trial_name)) {
     if (GetTrialType(feature) == OriginTrialType::kDeprecation) {
       return true;
@@ -96,7 +97,7 @@
 
 
 base::span<const mojom::OriginTrialFeature> origin_trials::FeaturesForTrial(
-    base::StringPiece trial_name) {
+    std::string_view trial_name) {
   auto it = base::ranges::find(kTrialToFeaturesMap, trial_name,
                                &TrialToFeature::trial_name);
   DCHECK(it != std::end(kTrialToFeaturesMap));
diff --git a/third_party/blink/renderer/controller/BUILD.gn b/third_party/blink/renderer/controller/BUILD.gn
index 6af8af9e..47e37a2 100644
--- a/third_party/blink/renderer/controller/BUILD.gn
+++ b/third_party/blink/renderer/controller/BUILD.gn
@@ -55,6 +55,8 @@
     "controller_export.h",
     "dev_tools_frontend_impl.cc",
     "dev_tools_frontend_impl.h",
+    "javascript_call_stack_collector.cc",
+    "javascript_call_stack_collector.h",
     "javascript_call_stack_generator.cc",
     "javascript_call_stack_generator.h",
     "memory_usage_monitor.cc",
diff --git a/third_party/blink/renderer/controller/javascript_call_stack_collector.cc b/third_party/blink/renderer/controller/javascript_call_stack_collector.cc
new file mode 100644
index 0000000..bab4ce68
--- /dev/null
+++ b/third_party/blink/renderer/controller/javascript_call_stack_collector.cc
@@ -0,0 +1,133 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/controller/javascript_call_stack_collector.h"
+
+#include "third_party/blink/public/common/permissions_policy/document_policy_features.h"
+#include "third_party/blink/public/common/tokens/tokens.h"
+#include "third_party/blink/public/platform/platform.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context.h"
+#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/platform/bindings/dom_wrapper_world.h"
+#include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/scheduler/public/main_thread.h"
+#include "third_party/blink/renderer/platform/scheduler/public/main_thread_scheduler.h"
+#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
+#include "third_party/blink/renderer/platform/wtf/cross_thread_copier.h"
+#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
+#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+#include "third_party/blink/renderer/platform/wtf/wtf.h"
+
+namespace WTF {
+
+template <>
+struct CrossThreadCopier<std::optional<blink::LocalFrameToken>>
+    : public CrossThreadCopierPassThrough<
+          std::optional<blink::LocalFrameToken>> {};
+
+}  // namespace WTF
+
+namespace blink {
+
+namespace {
+
+// Format the callstack in a format that's
+// consistent with Error.stack
+void FormatStackTrace(v8::Isolate* isolate, StringBuilder& builder) {
+  std::ostringstream oss;
+  v8::Message::PrintCurrentStackTrace(isolate, oss);
+  const std::string stack_trace = oss.str();
+  std::istringstream iss(stack_trace);
+  std::string line;
+  while (std::getline(iss, line)) {
+    builder.Append("\n    at ");
+    builder.Append(line.data(), base::checked_cast<unsigned>(line.size()));
+  }
+}
+
+void PostHandleCollectedCallStackTask(
+    JavaScriptCallStackCollector* collector,
+    WTF::StringBuilder& builder,
+    std::optional<LocalFrameToken> frame_token = std::nullopt) {
+  DCHECK(Platform::Current());
+  PostCrossThreadTask(
+      *Platform::Current()->GetIOTaskRunner(), FROM_HERE,
+      WTF::CrossThreadBindOnce(
+          &JavaScriptCallStackCollector::HandleCallStackCollected,
+          WTF::CrossThreadUnretained(collector), builder.ReleaseString(),
+          frame_token));
+}
+
+void GenerateJavaScriptCallStack(v8::Isolate* isolate, void* data) {
+  CHECK(IsMainThread());
+
+  auto* collector = static_cast<JavaScriptCallStackCollector*>(data);
+  v8::HandleScope handle_scope(isolate);
+  WTF::StringBuilder builder;
+  if (!isolate->InContext()) {
+    PostHandleCollectedCallStackTask(collector, builder);
+    return;
+  }
+
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  ScriptState* script_state = ScriptState::MaybeFrom(context);
+  if (!script_state) {
+    PostHandleCollectedCallStackTask(collector, builder);
+    return;
+  }
+  ExecutionContext* execution_context = ToExecutionContext(script_state);
+  DOMWrapperWorld& world = script_state->World();
+  auto* execution_dom_window = DynamicTo<LocalDOMWindow>(execution_context);
+  LocalFrame* frame =
+      execution_dom_window ? execution_dom_window->GetFrame() : nullptr;
+
+  std::optional<LocalFrameToken> frame_token;
+  if (frame && world.IsMainWorld()) {
+    frame_token = frame->GetLocalFrameToken();
+    if (!execution_context->IsFeatureEnabled(
+            mojom::blink::DocumentPolicyFeature::
+                kIncludeJSCallStacksInCrashReports)) {
+      builder.Append(
+          "Website owner has not opted in for JS call stacks in crash "
+          "reports.");
+    } else {
+      FormatStackTrace(isolate, builder);
+    }
+  }
+  PostHandleCollectedCallStackTask(collector, builder, frame_token);
+}
+
+}  // namespace
+
+void JavaScriptCallStackCollector::InterruptIsolateAndCollectCallStack(
+    v8::Isolate* isolate) {
+  if (has_interrupted_isolate_) {
+    return;
+  }
+  has_interrupted_isolate_ = true;
+  isolate->RequestInterrupt(&GenerateJavaScriptCallStack,
+                            static_cast<void*>(this));
+}
+
+void JavaScriptCallStackCollector::HandleCallStackCollected(
+    const String& call_stack,
+    const std::optional<LocalFrameToken> frame_token) {
+  DCHECK(result_callback_);
+  std::move(result_callback_).Run(call_stack, frame_token);
+  DCHECK(finished_callback_);
+  std::move(finished_callback_).Run(this);
+}
+
+void JavaScriptCallStackCollector::CollectJavaScriptCallStack() {
+  Thread::MainThread()
+      ->Scheduler()
+      ->ToMainThreadScheduler()
+      ->ForEachMainThreadIsolate(WTF::BindRepeating(
+          &JavaScriptCallStackCollector::InterruptIsolateAndCollectCallStack,
+          WTF::Unretained(this)));
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/controller/javascript_call_stack_collector.h b/third_party/blink/renderer/controller/javascript_call_stack_collector.h
new file mode 100644
index 0000000..ab70b2a
--- /dev/null
+++ b/third_party/blink/renderer/controller/javascript_call_stack_collector.h
@@ -0,0 +1,43 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_CONTROLLER_JAVASCRIPT_CALL_STACK_COLLECTOR_H_
+#define THIRD_PARTY_BLINK_RENDERER_CONTROLLER_JAVASCRIPT_CALL_STACK_COLLECTOR_H_
+
+#include "third_party/blink/public/common/tokens/tokens.h"
+#include "third_party/blink/public/mojom/call_stack_generator/call_stack_generator.mojom-blink.h"
+#include "third_party/blink/renderer/controller/controller_export.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+#include "v8/include/v8.h"
+
+namespace blink {
+
+class CONTROLLER_EXPORT JavaScriptCallStackCollector {
+ public:
+  using FinishedCallback =
+      base::OnceCallback<void(JavaScriptCallStackCollector*)>;
+  using CollectJavaScriptCallStackCallback =
+      mojom::blink::CallStackGenerator::CollectJavaScriptCallStackCallback;
+
+  explicit JavaScriptCallStackCollector(
+      CollectJavaScriptCallStackCallback&& result_callback,
+      FinishedCallback finished_callback)
+      : result_callback_(std::move(result_callback)),
+        finished_callback_(std::move(finished_callback)) {}
+
+  void InterruptIsolateAndCollectCallStack(v8::Isolate* isolate);
+  void CollectJavaScriptCallStack();
+  void HandleCallStackCollected(
+      const String& call_stack,
+      const std::optional<LocalFrameToken> frame_token);
+
+ private:
+  CollectJavaScriptCallStackCallback result_callback_;
+  FinishedCallback finished_callback_;
+  bool has_interrupted_isolate_ = false;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CONTROLLER_JAVASCRIPT_CALL_STACK_COLLECTOR_H_
diff --git a/third_party/blink/renderer/controller/javascript_call_stack_generator.cc b/third_party/blink/renderer/controller/javascript_call_stack_generator.cc
index 4e6944a..ca6dfca 100644
--- a/third_party/blink/renderer/controller/javascript_call_stack_generator.cc
+++ b/third_party/blink/renderer/controller/javascript_call_stack_generator.cc
@@ -4,149 +4,42 @@
 
 #include "third_party/blink/renderer/controller/javascript_call_stack_generator.h"
 
-#include "base/numerics/safe_conversions.h"
-#include "third_party/blink/public/common/permissions_policy/document_policy_features.h"
-#include "third_party/blink/public/common/tokens/tokens.h"
-#include "third_party/blink/public/platform/platform.h"
-#include "third_party/blink/renderer/core/execution_context/execution_context.h"
-#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/platform/bindings/dom_wrapper_world.h"
-#include "third_party/blink/renderer/platform/bindings/script_state.h"
-#include "third_party/blink/renderer/platform/bindings/v8_binding.h"
-#include "third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h"
+#include "third_party/blink/renderer/controller/javascript_call_stack_collector.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-#include "third_party/blink/renderer/platform/scheduler/public/main_thread.h"
-#include "third_party/blink/renderer/platform/scheduler/public/main_thread_scheduler.h"
-#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
-#include "third_party/blink/renderer/platform/wtf/cross_thread_copier.h"
-#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
-#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
-#include "third_party/blink/renderer/platform/wtf/wtf.h"
-
-namespace WTF {
-
-template <>
-struct CrossThreadCopier<std::optional<blink::LocalFrameToken>>
-    : public CrossThreadCopierPassThrough<
-          std::optional<blink::LocalFrameToken>> {};
-
-}  // namespace WTF
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
 
 namespace {
 
-// Format the callstack in a format that's
-// consistent with Error.stack
-void FormatStackTrace(v8::Isolate* isolate, StringBuilder& builder) {
-  std::ostringstream oss;
-  v8::Message::PrintCurrentStackTrace(isolate, oss);
-  const std::string stack_trace = oss.str();
-  std::istringstream iss(stack_trace);
-  std::string line;
-  while (std::getline(iss, line)) {
-    builder.Append("\n    at ");
-    builder.Append(line.data(), base::checked_cast<unsigned>(line.size()));
-  }
-}
-
-void PostHandleCollectedCallStackTask(
-    JavaScriptCallStackGenerator* generator,
-    WTF::StringBuilder& builder,
-    std::optional<LocalFrameToken> frame_token = std::nullopt) {
-  DCHECK(Platform::Current());
-  PostCrossThreadTask(
-      *Platform::Current()->GetIOTaskRunner(), FROM_HERE,
-      WTF::CrossThreadBindOnce(
-          [](JavaScriptCallStackGenerator* generator, String call_stack,
-             std::optional<LocalFrameToken> frame_token) {
-            generator->HandleCallStackCollected(call_stack, frame_token);
-          },
-          CrossThreadUnretained(generator), builder.ReleaseString(),
-          frame_token));
-}
-
-void GenerateJavaScriptCallStack(v8::Isolate* isolate, void* data) {
-  CHECK(IsMainThread());
-
-  auto* generator = static_cast<JavaScriptCallStackGenerator*>(data);
-  v8::HandleScope handle_scope(isolate);
-  WTF::StringBuilder builder;
-  if (!isolate->InContext()) {
-    PostHandleCollectedCallStackTask(generator, builder);
-    return;
-  }
-
-  v8::Local<v8::Context> context = isolate->GetCurrentContext();
-  ScriptState* script_state = ScriptState::MaybeFrom(context);
-  if (!script_state) {
-    PostHandleCollectedCallStackTask(generator, builder);
-    return;
-  }
-  ExecutionContext* execution_context = ToExecutionContext(script_state);
-  DOMWrapperWorld& world = script_state->World();
-  auto* execution_dom_window = DynamicTo<LocalDOMWindow>(execution_context);
-  LocalFrame* frame =
-      execution_dom_window ? execution_dom_window->GetFrame() : nullptr;
-
-  std::optional<LocalFrameToken> frame_token;
-  if (frame && world.IsMainWorld()) {
-    frame_token = frame->GetLocalFrameToken();
-    if (!execution_context->IsFeatureEnabled(
-            mojom::blink::DocumentPolicyFeature::
-                kIncludeJSCallStacksInCrashReports)) {
-      builder.Append(
-          "Website owner has not opted in for JS call stacks in crash "
-          "reports.");
-    } else {
-      FormatStackTrace(isolate, builder);
-    }
-  }
-  PostHandleCollectedCallStackTask(generator, builder, frame_token);
-}
-
-}  // namespace
-
-// At any point in time, there is at most one execution context per isolate
-// that is actually executing code.
-void JavaScriptCallStackGenerator::InterruptIsolateAndCollectCallStack(
-    v8::Isolate* isolate) {
-  isolate->RequestInterrupt(&GenerateJavaScriptCallStack,
-                            static_cast<void*>(this));
-}
-
-void JavaScriptCallStackGenerator::HandleCallStackCollected(
-    const String& call_stack,
-    const std::optional<LocalFrameToken> frame_token) {
-  if (!call_stack_collected_) {
-    call_stack_collected_ = true;
-    DCHECK(callback_);
-    std::move(callback_).Run(call_stack, frame_token);
-  }
-}
-
-void JavaScriptCallStackGenerator::CollectJavaScriptCallStack(
-    CollectJavaScriptCallStackCallback callback) {
-  call_stack_collected_ = false;
-  if (RuntimeEnabledFeatures::
-          DocumentPolicyIncludeJSCallStacksInCrashReportsEnabled()) {
-    callback_ = std::move(callback);
-    Thread::MainThread()
-        ->Scheduler()
-        ->ToMainThreadScheduler()
-        ->ForEachMainThreadIsolate(WTF::BindRepeating(
-            &JavaScriptCallStackGenerator::InterruptIsolateAndCollectCallStack,
-            WTF::Unretained(this)));
-  }
-}
-
 JavaScriptCallStackGenerator& GetJavaScriptCallStackGenerator() {
   DEFINE_THREAD_SAFE_STATIC_LOCAL(JavaScriptCallStackGenerator,
                                   javascript_call_stack_generator, ());
   return javascript_call_stack_generator;
 }
 
+}  // namespace
+
+void JavaScriptCallStackGenerator::OnCollectorFinished(
+    JavaScriptCallStackCollector* collector) {
+  collectors_.erase(collector);
+}
+
+void JavaScriptCallStackGenerator::CollectJavaScriptCallStack(
+    CollectJavaScriptCallStackCallback callback) {
+  if (RuntimeEnabledFeatures::
+          DocumentPolicyIncludeJSCallStacksInCrashReportsEnabled()) {
+    std::unique_ptr<JavaScriptCallStackCollector> call_stack_collector =
+        std::make_unique<JavaScriptCallStackCollector>(
+            std::move(callback),
+            WTF::BindOnce(&JavaScriptCallStackGenerator::OnCollectorFinished,
+                          WTF::Unretained(this)));
+    JavaScriptCallStackCollector* raw_collector = call_stack_collector.get();
+    collectors_.Set(raw_collector, std::move(call_stack_collector));
+    raw_collector->CollectJavaScriptCallStack();
+  }
+}
+
 void JavaScriptCallStackGenerator::Bind(
     mojo::PendingReceiver<mojom::blink::CallStackGenerator> receiver) {
   DCHECK(!GetJavaScriptCallStackGenerator().receiver_.is_bound());
diff --git a/third_party/blink/renderer/controller/javascript_call_stack_generator.h b/third_party/blink/renderer/controller/javascript_call_stack_generator.h
index 91f85ed..89ac4d98 100644
--- a/third_party/blink/renderer/controller/javascript_call_stack_generator.h
+++ b/third_party/blink/renderer/controller/javascript_call_stack_generator.h
@@ -7,10 +7,10 @@
 
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
-#include "third_party/blink/public/common/tokens/tokens.h"
 #include "third_party/blink/public/mojom/call_stack_generator/call_stack_generator.mojom-blink.h"
 #include "third_party/blink/renderer/controller/controller_export.h"
-#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+#include "third_party/blink/renderer/controller/javascript_call_stack_collector.h"
+#include "third_party/blink/renderer/platform/wtf/hash_map.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -22,16 +22,15 @@
       mojo::PendingReceiver<mojom::blink::CallStackGenerator> receiver);
   void CollectJavaScriptCallStack(
       CollectJavaScriptCallStackCallback callback) override;
-  void HandleCallStackCollected(
-      const String& call_stack,
-      const std::optional<LocalFrameToken> frame_token);
+  void OnCollectorFinished(JavaScriptCallStackCollector* collector);
 
  private:
   void InterruptIsolateAndCollectCallStack(v8::Isolate* isolate);
 
   mojo::Receiver<mojom::blink::CallStackGenerator> receiver_{this};
-  CollectJavaScriptCallStackCallback callback_;
-  bool call_stack_collected_ = false;
+  WTF::HashMap<JavaScriptCallStackCollector*,
+               std::unique_ptr<JavaScriptCallStackCollector>>
+      collectors_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_perftest.cc b/third_party/blink/renderer/core/css/style_perftest.cc
index 4370a0e..26b0757 100644
--- a/third_party/blink/renderer/core/css/style_perftest.cc
+++ b/third_party/blink/renderer/core/css/style_perftest.cc
@@ -9,8 +9,7 @@
 // not yet checked in. The tests will be skipped if you don't have the
 // files available.
 
-#include "third_party/blink/renderer/core/css/resolver/style_resolver.h"
-#include "third_party/blink/renderer/core/css/style_recalc_change.h"
+#include <string_view>
 
 #include "base/command_line.h"
 #include "base/json/json_reader.h"
@@ -18,8 +17,10 @@
 #include "testing/perf/perf_test.h"
 #include "third_party/blink/renderer/core/css/container_query_data.h"
 #include "third_party/blink/renderer/core/css/parser/css_tokenizer.h"
+#include "third_party/blink/renderer/core/css/resolver/style_resolver.h"
 #include "third_party/blink/renderer/core/css/style_change_reason.h"
 #include "third_party/blink/renderer/core/css/style_engine.h"
+#include "third_party/blink/renderer/core/css/style_recalc_change.h"
 #include "third_party/blink/renderer/core/css/style_sheet_contents.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/dom_token_list.h"
@@ -190,7 +191,7 @@
       return result;
     }
     std::optional<base::Value> json = base::JSONReader::Read(
-        base::StringPiece(serialized->Data(), serialized->size()));
+        std::string_view(serialized->Data(), serialized->size()));
     CHECK(json.has_value());
     page = LoadDumpedPage(json->GetDict(), result.parse_time, reporter);
   }
diff --git a/third_party/blink/renderer/core/frame/attribution_src_loader.cc b/third_party/blink/renderer/core/frame/attribution_src_loader.cc
index 3ffa1d3f..2410839 100644
--- a/third_party/blink/renderer/core/frame/attribution_src_loader.cc
+++ b/third_party/blink/renderer/core/frame/attribution_src_loader.cc
@@ -135,8 +135,7 @@
   }
   auto parsed_registration_info =
       attribution_reporting::RegistrationInfo::ParseInfo(
-          StringUTF8Adaptor(info_header).AsStringPiece(),
-          cross_app_web_enabled);
+          StringUTF8Adaptor(info_header).AsStringView(), cross_app_web_enabled);
   if (!parsed_registration_info.has_value()) {
     LogAuditIssue(execution_context,
                   AttributionReportingIssueType::kInvalidInfoHeader,
@@ -988,7 +987,7 @@
       base::UmaHistogramCounts1M("Conversions.HeadersSize.RegisterSource",
                                  headers.web_source.length());
       auto source_data = attribution_reporting::SourceRegistration::Parse(
-          StringUTF8Adaptor(headers.web_source).AsStringPiece(), source_type_);
+          StringUTF8Adaptor(headers.web_source).AsStringView(), source_type_);
       if (!source_data.has_value()) {
         LogAuditIssueAndMaybeReportHeaderError(
             headers, registration_info.report_header_errors,
@@ -1014,7 +1013,7 @@
 
       auto registration_items =
           attribution_reporting::ParseOsSourceOrTriggerHeader(
-              StringUTF8Adaptor(headers.os_source).AsStringPiece());
+              StringUTF8Adaptor(headers.os_source).AsStringView());
       if (!registration_items.has_value()) {
         LogAuditIssueAndMaybeReportHeaderError(
             headers, registration_info.report_header_errors,
@@ -1060,7 +1059,7 @@
                                  headers.web_trigger.length());
 
       auto trigger_data = attribution_reporting::TriggerRegistration::Parse(
-          StringUTF8Adaptor(headers.web_trigger).AsStringPiece());
+          StringUTF8Adaptor(headers.web_trigger).AsStringView());
       if (!trigger_data.has_value()) {
         LogAuditIssueAndMaybeReportHeaderError(
             headers, registration_info.report_header_errors,
@@ -1086,7 +1085,7 @@
 
       auto registration_items =
           attribution_reporting::ParseOsSourceOrTriggerHeader(
-              StringUTF8Adaptor(headers.os_trigger).AsStringPiece());
+              StringUTF8Adaptor(headers.os_trigger).AsStringView());
       if (!registration_items.has_value()) {
         LogAuditIssueAndMaybeReportHeaderError(
             headers, registration_info.report_header_errors,
@@ -1146,7 +1145,7 @@
     data_host_->ReportRegistrationHeaderError(
         std::move(reporting_origin),
         attribution_reporting::RegistrationHeaderError(
-            StringUTF8Adaptor(header).AsStringPiece(), error_details));
+            StringUTF8Adaptor(header).AsStringView(), error_details));
   }
 }
 
diff --git a/third_party/blink/renderer/core/html/html_perftest.cc b/third_party/blink/renderer/core/html/html_perftest.cc
index 22b818c..a5865522 100644
--- a/third_party/blink/renderer/core/html/html_perftest.cc
+++ b/third_party/blink/renderer/core/html/html_perftest.cc
@@ -5,6 +5,8 @@
 // A benchmark to isolate the HTML parsing done in the Speedometer test,
 // for more stable benchmarking and profiling.
 
+#include <string_view>
+
 #include "base/command_line.h"
 #include "base/json/json_reader.h"
 #include "testing/perf/perf_result_reporter.h"
@@ -36,7 +38,7 @@
   scoped_refptr<SharedBuffer> serialized =
       test::ReadFromFile(test::CoreTestDataPath(filename));
   std::optional<base::Value> json = base::JSONReader::Read(
-      base::StringPiece(serialized->Data(), serialized->size()));
+      std::string_view(serialized->Data(), serialized->size()));
   if (!json.has_value()) {
     char msg[256];
     snprintf(msg, sizeof(msg), "Skipping %s test because %s could not be read",
diff --git a/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc b/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc
index 9d70862..4cb53f1 100644
--- a/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc
+++ b/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc
@@ -2,9 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h"
-
 #include <cstddef>
+#include <string_view>
 #include <tuple>
 
 #include "base/run_loop.h"
@@ -20,6 +19,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/html/html_anchor_element.h"
 #include "third_party/blink/renderer/core/input/event_handler.h"
+#include "third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h"
 #include "third_party/blink/renderer/core/testing/sim/sim_request.h"
 #include "third_party/blink/renderer/core/testing/sim/sim_test.h"
 #include "third_party/blink/renderer/platform/scheduler/test/fake_task_runner.h"
@@ -520,7 +520,7 @@
 
 class AnchorElementInteractionMouseMotionEstimatorFeatureFlagTest
     : public AnchorElementInteractionTest,
-      public ::testing::WithParamInterface<base::StringPiece> {
+      public ::testing::WithParamInterface<std::string_view> {
  public:
   bool IsMouseMotionEstimatorFeatureEnabled() {
     return GetParam() == "enabled";
diff --git a/third_party/blink/renderer/core/loader/url_matcher.cc b/third_party/blink/renderer/core/loader/url_matcher.cc
index e29bf9a..6d6f4d7 100644
--- a/third_party/blink/renderer/core/loader/url_matcher.cc
+++ b/third_party/blink/renderer/core/loader/url_matcher.cc
@@ -4,11 +4,13 @@
 
 #include "third_party/blink/renderer/core/loader/url_matcher.h"
 
+#include <string_view>
+
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 
 namespace blink {
 
-UrlMatcher::UrlMatcher(const base::StringPiece& encoded_url_list_string) {
+UrlMatcher::UrlMatcher(const std::string_view& encoded_url_list_string) {
   ParseFieldTrialParam(encoded_url_list_string);
 }
 
@@ -41,7 +43,7 @@
 }
 
 void UrlMatcher::ParseFieldTrialParam(
-    const base::StringPiece& encoded_url_list_string) {
+    const std::string_view& encoded_url_list_string) {
   Vector<String> parsed_strings;
   String::FromUTF8(encoded_url_list_string)
       .Split(",", /*allow_empty_entries=*/false, parsed_strings);
diff --git a/third_party/blink/renderer/core/loader/url_matcher.h b/third_party/blink/renderer/core/loader/url_matcher.h
index ed01a88..40c0ea8 100644
--- a/third_party/blink/renderer/core/loader/url_matcher.h
+++ b/third_party/blink/renderer/core/loader/url_matcher.h
@@ -5,6 +5,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_URL_MATCHER_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_URL_MATCHER_H_
 
+#include <string_view>
+
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
@@ -36,7 +38,7 @@
 // contain it or not.
 class CORE_EXPORT UrlMatcher final {
  public:
-  explicit UrlMatcher(const base::StringPiece& encoded_url_list_string);
+  explicit UrlMatcher(const std::string_view& encoded_url_list_string);
   ~UrlMatcher();
 
   bool Match(const KURL& url) const;
@@ -46,7 +48,7 @@
       std::pair<scoped_refptr<const SecurityOrigin>, std::optional<String>>>;
   UrlList url_list_;
 
-  void ParseFieldTrialParam(const base::StringPiece& encoded_url_list_string);
+  void ParseFieldTrialParam(const std::string_view& encoded_url_list_string);
 };
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc b/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc
index ae85c02..6626296 100644
--- a/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc
+++ b/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc
@@ -683,7 +683,7 @@
 
   TrialTokenResult token_result =
       trial_token_validator_->ValidateTokenAndTrialWithOriginInfo(
-          token_string.AsStringPiece(),
+          token_string.AsStringView(),
           TrialTokenValidator::OriginInfo(origin_info.origin->ToUrlOrigin(),
                                           origin_info.is_secure),
           script_url_origins, base::Time::Now());
diff --git a/third_party/blink/renderer/core/origin_trials/origin_trial_context_test.cc b/third_party/blink/renderer/core/origin_trials/origin_trial_context_test.cc
index 4a1918e6..033cddf 100644
--- a/third_party/blink/renderer/core/origin_trials/origin_trial_context_test.cc
+++ b/third_party/blink/renderer/core/origin_trials/origin_trial_context_test.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
 
 #include <memory>
+#include <string_view>
 #include <vector>
 
 #include "base/containers/span.h"
@@ -73,7 +74,7 @@
     const OriginInfo origin;
     Vector<OriginInfo> third_party_origin_info;
     const base::Time current_time;
-    ValidationParams(base::StringPiece token_param,
+    ValidationParams(std::string_view token_param,
                      const OriginInfo& origin_info,
                      base::span<const OriginInfo> scripts,
                      base::Time time)
@@ -88,7 +89,7 @@
   ~MockTokenValidator() override = default;
 
   TrialTokenResult ValidateTokenAndTrialWithOriginInfo(
-      base::StringPiece token,
+      std::string_view token,
       const OriginInfo& origin,
       base::span<const OriginInfo> third_party_origin_info,
       base::Time current_time) const override {
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_test.cc b/third_party/blink/renderer/core/paint/compositing/compositing_test.cc
index 3e2bab0..fbfbb1f3 100644
--- a/third_party/blink/renderer/core/paint/compositing/compositing_test.cc
+++ b/third_party/blink/renderer/core/paint/compositing/compositing_test.cc
@@ -601,9 +601,11 @@
 }
 
 // https://crbug.com/1459318
-TEST_P(CompositingTest, FullPACUpdateOnScrollWithSyntheticClipAcrossScroller) {
+TEST_P(CompositingTest,
+       FullPACUpdateOnScrollWithSyntheticClipAcrossScrollerSimpleRadius) {
   InitializeWithHTML(*WebView()->MainFrameImpl()->GetFrame(), R"HTML(
-    <div id="scroll" style="width: 200px; height: 200px; border-radius: 2px;
+    <div id="scroll" style="width: 200px; height: 200px;
+                            border-radius: 2px;
                             overflow: scroll; background: white">
       <div id="masked" style="width: 100px; height: 100px;
                               backdrop-filter: blur(1px)"></div>
@@ -616,6 +618,28 @@
   GetLocalFrameView()->UpdateAllLifecyclePhasesExceptPaint(
       DocumentUpdateReason::kTest);
   EXPECT_TRUE(paint_artifact_compositor()->NeedsUpdate());
+  UpdateAllLifecyclePhases();
+}
+
+// https://crbug.com/1459318
+TEST_P(CompositingTest,
+       FullPACUpdateOnScrollWithSyntheticClipAcrossScrollerComplexRadius) {
+  InitializeWithHTML(*WebView()->MainFrameImpl()->GetFrame(), R"HTML(
+    <div id="scroll" style="width: 200px; height: 200px;
+                            border-radius: 2px / 4px;
+                            overflow: scroll; background: white">
+      <div id="masked" style="width: 100px; height: 100px;
+                              backdrop-filter: blur(1px)"></div>
+      <div style="height: 200px"></div>
+    </div>
+  )HTML");
+
+  EXPECT_FALSE(paint_artifact_compositor()->NeedsUpdate());
+  GetElementById("scroll")->scrollTo(0, 2);
+  GetLocalFrameView()->UpdateAllLifecyclePhasesExceptPaint(
+      DocumentUpdateReason::kTest);
+  EXPECT_TRUE(paint_artifact_compositor()->NeedsUpdate());
+  UpdateAllLifecyclePhases();
 }
 
 TEST_P(CompositingTest, HitTestOpaqueness) {
diff --git a/third_party/blink/renderer/core/timing/background_tracing_helper.cc b/third_party/blink/renderer/core/timing/background_tracing_helper.cc
index d843738..dc11a2d 100644
--- a/third_party/blink/renderer/core/timing/background_tracing_helper.cc
+++ b/third_party/blink/renderer/core/timing/background_tracing_helper.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/core/timing/background_tracing_helper.h"
 
+#include <string_view>
+
 #include "base/containers/span.h"
 #include "base/feature_list.h"
 #include "base/hash/md5.h"
@@ -245,7 +247,7 @@
 }
 
 // static
-size_t BackgroundTracingHelper::GetSequenceNumberPos(base::StringPiece string) {
+size_t BackgroundTracingHelper::GetSequenceNumberPos(std::string_view string) {
   // Extract any trailing integers.
   size_t cursor = string.size();
   while (cursor > 0) {
@@ -273,7 +275,7 @@
 }
 
 // static
-uint32_t BackgroundTracingHelper::MD5Hash32(base::StringPiece string) {
+uint32_t BackgroundTracingHelper::MD5Hash32(std::string_view string) {
   base::MD5Digest digest;
   base::MD5Sum(base::as_byte_span(string), &digest);
   return base::numerics::U32FromBigEndian(base::span(digest.a).first<4u>());
@@ -281,7 +283,7 @@
 
 // static
 void BackgroundTracingHelper::GetMarkHashAndSequenceNumber(
-    base::StringPiece mark_name,
+    std::string_view mark_name,
     uint32_t sequence_number_offset,
     uint32_t* mark_hash,
     uint32_t* sequence_number) {
@@ -313,7 +315,7 @@
 
 // static
 bool BackgroundTracingHelper::ParseBackgroundTracingPerformanceMarkHashes(
-    base::StringPiece allow_list,
+    std::string_view allow_list,
     SiteMarkHashMap& allow_listed_hashes) {
   // We parse into this temporary structure, and move into the output on
   // success.
diff --git a/third_party/blink/renderer/core/timing/background_tracing_helper.h b/third_party/blink/renderer/core/timing/background_tracing_helper.h
index 047b071..ffcc00a 100644
--- a/third_party/blink/renderer/core/timing/background_tracing_helper.h
+++ b/third_party/blink/renderer/core/timing/background_tracing_helper.h
@@ -7,8 +7,8 @@
 
 #include <cstdint>
 #include <string>
+#include <string_view>
 
-#include "base/strings/string_piece.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/wtf/hash_map.h"
@@ -58,7 +58,7 @@
   // This is used by the "sequence number" mechanism for mark names. Returns
   // the location of the underscore if a split is to occur, otherwise returns
   // 0.
-  static size_t GetSequenceNumberPos(base::StringPiece string);
+  static size_t GetSequenceNumberPos(std::string_view string);
 
   // Generates a 32-bit MD5 hash of the given string piece. This will return a
   // value that is equivalent to the first 8 bytes of a full MD5 hash. In bash
@@ -71,13 +71,13 @@
   //   echo -n <string_value> | md5sum | cut -b 1-8
   //
   // This will return the same result as MD5Hash32Constexpr as defined in
-  // base/hash/md5_constexpr.h. This uses base::StringPiece because it is
+  // base/hash/md5_constexpr.h. This uses std::string_view because it is
   // interacting with Finch code, which doesn't use WTF primitives.
-  static uint32_t MD5Hash32(base::StringPiece string);
+  static uint32_t MD5Hash32(std::string_view string);
 
   // Given a mark name with an optional sequence number suffix, parses out the
   // suffix and hashes the mark name.
-  static void GetMarkHashAndSequenceNumber(base::StringPiece mark_name,
+  static void GetMarkHashAndSequenceNumber(std::string_view mark_name,
                                            uint32_t sequence_number_offset,
                                            uint32_t* mark_hash,
                                            uint32_t* sequence_number);
@@ -92,7 +92,7 @@
   // std::string because it is interacting with Finch code, which doesn't use
   // WTF primitives.
   static bool ParseBackgroundTracingPerformanceMarkHashes(
-      base::StringPiece allow_list,
+      std::string_view allow_list,
       SiteMarkHashMap& allow_listed_hashes);
 
  private:
diff --git a/third_party/blink/renderer/core/timing/background_tracing_helper_test.cc b/third_party/blink/renderer/core/timing/background_tracing_helper_test.cc
index 4ecac43..3f1d6806 100644
--- a/third_party/blink/renderer/core/timing/background_tracing_helper_test.cc
+++ b/third_party/blink/renderer/core/timing/background_tracing_helper_test.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/core/timing/background_tracing_helper.h"
 
+#include <string_view>
+
 #include "base/hash/md5_constexpr.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/platform/testing/task_environment.h"
@@ -18,15 +20,15 @@
   BackgroundTracingHelperTest() = default;
   ~BackgroundTracingHelperTest() override = default;
 
-  static size_t GetSequenceNumberPos(base::StringPiece string) {
+  static size_t GetSequenceNumberPos(std::string_view string) {
     return BackgroundTracingHelper::GetSequenceNumberPos(string);
   }
 
-  static uint32_t MD5Hash32(base::StringPiece string) {
+  static uint32_t MD5Hash32(std::string_view string) {
     return BackgroundTracingHelper::MD5Hash32(string);
   }
 
-  static void GetMarkHashAndSequenceNumber(base::StringPiece mark_name,
+  static void GetMarkHashAndSequenceNumber(std::string_view mark_name,
                                            uint32_t sequence_number_offset,
                                            uint32_t* mark_hash,
                                            uint32_t* sequence_number) {
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc b/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc
index 084529b..7581669 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/core/url_pattern/url_pattern_component.h"
 
+#include <string_view>
+
 #include "base/metrics/histogram_functions.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/ranges/algorithm.h"
@@ -45,7 +47,7 @@
 }
 
 // Utility method to get the correct encoding callback for a given type.
-liburlpattern::EncodeCallback GetEncodeCallback(base::StringPiece pattern_utf8,
+liburlpattern::EncodeCallback GetEncodeCallback(std::string_view pattern_utf8,
                                                 Component::Type type,
                                                 Component* protocol_component) {
   switch (type) {
@@ -196,7 +198,7 @@
   StringUTF8Adaptor utf8(final_pattern);
   auto parse_result = liburlpattern::Parse(
       absl::string_view(utf8.data(), utf8.size()),
-      GetEncodeCallback(utf8.AsStringPiece(), type, protocol_component),
+      GetEncodeCallback(utf8.AsStringView(), type, protocol_component),
       options);
   if (!parse_result.ok()) {
     exception_state.ThrowTypeError(
diff --git a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc
index 297488e..26443df 100644
--- a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc
+++ b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc
@@ -5,7 +5,6 @@
 #include "third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.h"
 
 #include "base/memory/scoped_refptr.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
 #include "mojo/public/cpp/bindings/map_traits_wtf_hash_map.h"
 #include "mojo/public/cpp/bindings/message.h"
diff --git a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc
index 580b9374..0babcc8 100644
--- a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc
+++ b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc
@@ -105,7 +105,7 @@
   }
 
   std::optional<StorageKey> key =
-      StorageKey::Deserialize(StringUTF8Adaptor(*storage_key).AsStringPiece());
+      StorageKey::Deserialize(StringUTF8Adaptor(*storage_key).AsStringView());
   if (!key.has_value()) {
     return ProtocolResponse::ServerError("Not able to deserialize storage key");
   }
@@ -653,7 +653,7 @@
                       ? maybe_storage_key.value()
                       : maybe_storage_bucket.value().getStorageKey();
     std::optional<StorageKey> key =
-        StorageKey::Deserialize(StringUTF8Adaptor(storage_key).AsStringPiece());
+        StorageKey::Deserialize(StringUTF8Adaptor(storage_key).AsStringView());
     if (!key.has_value()) {
       callback->sendFailure(ProtocolResponse::InvalidParams(
           "Not able to deserialize storage key"));
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.cc b/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.cc
index 99daff6..dafe66dc 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.cc
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.cc
@@ -393,7 +393,7 @@
     case V8UnionArrayBufferOrArrayBufferViewOrBlobOrUSVString::ContentType::
         kUSVString:
       data_source = std::make_unique<mojo::StringDataSource>(
-          StringUTF8Adaptor(data->GetAsUSVString()).AsStringPiece(),
+          StringUTF8Adaptor(data->GetAsUSVString()).AsStringView(),
           mojo::StringDataSource::AsyncWritingMode::
               STRING_MAY_BE_INVALIDATED_BEFORE_COMPLETION);
       break;
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
index f2584559..d3b1d742 100644
--- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
@@ -6,6 +6,7 @@
 
 #include <algorithm>
 #include <memory>
+#include <string_view>
 #include <utility>
 
 #include "base/feature_list.h"
@@ -933,7 +934,7 @@
       ->CreateVideoEncoderMetricsProvider();
 }
 
-void MediaRecorderHandler::WriteData(base::StringPiece data) {
+void MediaRecorderHandler::WriteData(std::string_view data) {
   DCHECK(IsMainThread());
   DVLOG(3) << __func__ << " " << data.length() << "B";
   if (invalidated_)
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h
index 8f9045b8..c60ab9e 100644
--- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h
+++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h
@@ -7,9 +7,9 @@
 
 #include <memory>
 #include <optional>
+#include <string_view>
 
 #include "base/feature_list.h"
-#include "base/strings/string_piece.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
@@ -142,7 +142,7 @@
       std::optional<media::VideoEncoder::CodecDescription> codec_description,
       base::TimeTicks timestamp,
       bool is_key_frame);
-  void WriteData(base::StringPiece data);
+  void WriteData(std::string_view data);
 
   // Updates recorded tracks live and enabled.
   void UpdateTracksLiveAndEnabled();
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc
index 1aa3efaf..bdb9c01 100644
--- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc
@@ -7,6 +7,7 @@
 #include <stddef.h>
 
 #include <string>
+#include <string_view>
 
 #include "base/files/file_path.h"
 #include "base/files/memory_mapped_file.h"
@@ -343,7 +344,7 @@
   std::string h264_video_stream_;
 
  private:
-  void LoadEncodedFile(base::StringPiece filename,
+  void LoadEncodedFile(std::string_view filename,
                        base::MemoryMappedFile& mapped_stream) {
     base::FilePath file_path = GetTestDataFilePath(filename);
 
@@ -351,7 +352,7 @@
         << "Couldn't open stream file: " << file_path.MaybeAsASCII();
   }
 
-  base::FilePath GetTestDataFilePath(base::StringPiece name) {
+  base::FilePath GetTestDataFilePath(std::string_view name) {
     base::FilePath file_path;
     base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &file_path);
     file_path = file_path.Append(FILE_PATH_LITERAL("media"))
diff --git a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
index eca9c0a..407bc349 100644
--- a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h"
 
 #include <sstream>
+#include <string_view>
 
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
@@ -514,8 +515,8 @@
 
   InSequence s;
   const base::TimeTicks timeticks_now = base::TimeTicks::Now();
-  base::StringPiece first_frame_encoded_data;
-  base::StringPiece first_frame_encoded_alpha;
+  std::string_view first_frame_encoded_data;
+  std::string_view first_frame_encoded_alpha;
   EXPECT_CALL(*mock_callback_interface_,
               OnEncodedVideo(_, _, _, _, timeticks_now, true))
       .Times(1)
@@ -523,8 +524,8 @@
                       SaveArg<2>(&first_frame_encoded_alpha)));
 
   const base::TimeTicks timeticks_later = base::TimeTicks::Now();
-  base::StringPiece second_frame_encoded_data;
-  base::StringPiece second_frame_encoded_alpha;
+  std::string_view second_frame_encoded_data;
+  std::string_view second_frame_encoded_alpha;
   EXPECT_CALL(*mock_callback_interface_,
               OnEncodedVideo(_, _, _, _, timeticks_later, false))
       .Times(1)
@@ -538,8 +539,8 @@
 
   base::RunLoop run_loop;
 
-  base::StringPiece third_frame_encoded_data;
-  base::StringPiece third_frame_encoded_alpha;
+  std::string_view third_frame_encoded_data;
+  std::string_view third_frame_encoded_alpha;
   EXPECT_CALL(*mock_callback_interface_, OnEncodedVideo(_, _, _, _, _, true))
       .Times(1)
       .WillOnce(DoAll(SaveArg<1>(&third_frame_encoded_data),
@@ -943,7 +944,7 @@
       media::VideoFrame::CreateBlackFrame(frame_size);
 
   InSequence s;
-  base::StringPiece first_frame_encoded_alpha;
+  std::string_view first_frame_encoded_alpha;
   EXPECT_CALL(*mock_callback_interface_, OnEncodedVideo(_, _, _, _, _, true))
       .Times(1)
       .WillOnce(SaveArg<2>(&first_frame_encoded_alpha));
@@ -951,14 +952,14 @@
 
   const scoped_refptr<media::VideoFrame> alpha_frame =
       media::VideoFrame::CreateTransparentFrame(frame_size);
-  base::StringPiece second_frame_encoded_alpha;
+  std::string_view second_frame_encoded_alpha;
   EXPECT_CALL(*mock_callback_interface_, OnEncodedVideo(_, _, _, _, _, true))
       .Times(1)
       .WillOnce(SaveArg<2>(&second_frame_encoded_alpha));
   Encode(alpha_frame, base::TimeTicks::Now());
 
   base::RunLoop run_loop;
-  base::StringPiece third_frame_encoded_alpha;
+  std::string_view third_frame_encoded_alpha;
   EXPECT_CALL(*mock_callback_interface_, OnEncodedVideo(_, _, _, _, _, false))
       .Times(1)
       .WillOnce(DoAll(SaveArg<2>(&third_frame_encoded_alpha),
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc
index 6c48901..a9270d0 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 #include <optional>
+#include <string_view>
 
 #include "base/memory/raw_ptr.h"
 #include "base/task/single_thread_task_runner.h"
@@ -18,7 +19,7 @@
 
 namespace blink {
 namespace {
-void WebRtcLogStringPiece(base::StringPiece message) {
+void WebRtcLogStringPiece(std::string_view message) {
   WebRtcLogMessage(std::string{message});
 }
 }  // namespace
diff --git a/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.cc b/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.cc
index 8113ef9..81dcfb9 100644
--- a/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.cc
+++ b/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.cc
@@ -114,8 +114,8 @@
 
   bool has_custom_scheme_prefix = false;
   StringUTF8Adaptor scheme_adaptor(scheme);
-  if (!IsValidCustomHandlerScheme(scheme_adaptor.AsStringPiece(),
-                                  security_level, &has_custom_scheme_prefix)) {
+  if (!IsValidCustomHandlerScheme(scheme_adaptor.AsStringView(), security_level,
+                                  &has_custom_scheme_prefix)) {
     if (has_custom_scheme_prefix) {
       error_string = "The scheme name '" + scheme +
                      "' is not allowed. Schemes starting with '" + scheme +
@@ -137,8 +137,8 @@
                                   const String& user_url,
                                   String& error_message) {
   StringUTF8Adaptor url_adaptor(user_url);
-  URLSyntaxErrorCode code = IsValidCustomHandlerURLSyntax(
-      GURL(full_url), url_adaptor.AsStringPiece());
+  URLSyntaxErrorCode code =
+      IsValidCustomHandlerURLSyntax(GURL(full_url), url_adaptor.AsStringView());
   switch (code) {
     case URLSyntaxErrorCode::kNoError:
       return true;
diff --git a/third_party/blink/renderer/modules/nfc/ndef_record.cc b/third_party/blink/renderer/modules/nfc/ndef_record.cc
index 1af9ffa..b2487d08 100644
--- a/third_party/blink/renderer/modules/nfc/ndef_record.cc
+++ b/third_party/blink/renderer/modules/nfc/ndef_record.cc
@@ -4,9 +4,10 @@
 
 #include "third_party/blink/renderer/modules/nfc/ndef_record.h"
 
+#include <string_view>
+
 #include "base/containers/contains.h"
 #include "base/notreached.h"
-#include "base/strings/string_piece.h"
 #include "services/device/public/mojom/nfc.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/idl_types.h"
 #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h"
@@ -117,8 +118,7 @@
   if (type.empty())
     return false;
 
-  static constexpr base::StringPiece kOtherCharsForCustomType(
-      ":!()+,-=@;$_*'.");
+  static constexpr std::string_view kOtherCharsForCustomType(":!()+,-=@;$_*'.");
   for (wtf_size_t i = 0; i < type.length(); i++) {
     if (!IsASCIIAlphanumeric(type[i]) &&
         !base::Contains(kOtherCharsForCustomType, type[i])) {
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter_test.cc b/third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter_test.cc
index 1c211e6..c6112162 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter_test.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter_test.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter.h"
 
+#include <string_view>
+
 #include "base/test/scoped_feature_list.h"
 #include "services/network/public/mojom/service_worker_router_info.mojom-shared.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -32,14 +34,14 @@
 }
 
 blink::SafeUrlPattern DefaultStringUrlPattern() {
-  auto make_fixed_part = [](base::StringPiece value) {
+  auto make_fixed_part = [](std::string_view value) {
     liburlpattern::Part part;
     part.modifier = liburlpattern::Modifier::kNone;
     part.type = liburlpattern::PartType::kFixed;
     part.value = value;
     return part;
   };
-  auto make_wildcard_part = [](base::StringPiece name) {
+  auto make_wildcard_part = [](std::string_view name) {
     liburlpattern::Part part;
     part.modifier = liburlpattern::Modifier::kNone;
     part.type = liburlpattern::PartType::kFullWildcard;
@@ -95,7 +97,7 @@
   {
     auto parse_result = liburlpattern::Parse(
         kFakeUrlPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.pathname = parse_result.value().PartList();
   }
@@ -143,21 +145,21 @@
   {
     auto parse_result = liburlpattern::Parse(
         kFakeProtoPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.protocol = parse_result.value().PartList();
   }
   {
     auto parse_result = liburlpattern::Parse(
         kFakeHostPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.hostname = parse_result.value().PartList();
   }
   {
     auto parse_result = liburlpattern::Parse(
         kFakePathPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.pathname = parse_result.value().PartList();
   }
@@ -208,14 +210,14 @@
   {
     auto parse_result = liburlpattern::Parse(
         kFakeHostPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.hostname = parse_result.value().PartList();
   }
   {
     auto parse_result = liburlpattern::Parse(
         kFakePathPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.pathname = parse_result.value().PartList();
   }
@@ -264,14 +266,14 @@
   {
     auto parse_result = liburlpattern::Parse(
         kFakeProtoPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.protocol = parse_result.value().PartList();
   }
   {
     auto parse_result = liburlpattern::Parse(
         kFakeHostPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.hostname = parse_result.value().PartList();
   }
@@ -281,7 +283,7 @@
     // Step 17 https://urlpattern.spec.whatwg.org/#canon-processing-for-init
     auto parse_result = liburlpattern::Parse(
         kFakeBaseURLPathname,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.pathname = parse_result.value().PartList();
   }
@@ -408,7 +410,7 @@
   {
     auto parse_result = liburlpattern::Parse(
         kFakeUrlPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.pathname = parse_result.value().PartList();
   }
@@ -448,7 +450,7 @@
   {
     auto parse_result = liburlpattern::Parse(
         kFakeUrlPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.pathname = parse_result.value().PartList();
   }
@@ -490,7 +492,7 @@
   {
     auto parse_result = liburlpattern::Parse(
         kFakeUrlPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.pathname = parse_result.value().PartList();
   }
@@ -910,7 +912,7 @@
   {
     auto parse_result = liburlpattern::Parse(
         kFakeUrlPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.pathname = parse_result.value().PartList();
   }
@@ -951,7 +953,7 @@
   {
     auto parse_result = liburlpattern::Parse(
         kFakeUrlPattern,
-        [](base::StringPiece input) { return std::string(input); });
+        [](std::string_view input) { return std::string(input); });
     ASSERT_TRUE(parse_result.ok());
     expected_url_pattern.pathname = parse_result.value().PartList();
   }
diff --git a/third_party/blink/renderer/platform/bindings/parkable_string.cc b/third_party/blink/renderer/platform/bindings/parkable_string.cc
index f5d06d72..41dca18c 100644
--- a/third_party/blink/renderer/platform/bindings/parkable_string.cc
+++ b/third_party/blink/renderer/platform/bindings/parkable_string.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/platform/bindings/parkable_string.h"
 
 #include <array>
+#include <string_view>
 
 #include "base/allocator/partition_allocator/src/partition_alloc/oom.h"
 #include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
@@ -633,11 +634,11 @@
   }
 
   TRACE_EVENT("blink", "ParkableStringImpl::Decompress");
-  base::StringPiece compressed_string_piece(
+  std::string_view compressed_string_piece(
       reinterpret_cast<const char*>(metadata_->compressed_->data()),
       metadata_->compressed_->size() * sizeof(uint8_t));
   String uncompressed;
-  base::StringPiece uncompressed_string_piece;
+  std::string_view uncompressed_string_piece;
   size_t size = CharactersSizeInBytes();
   char* char_data;
   if (is_8bit()) {
@@ -649,7 +650,7 @@
     uncompressed = String::CreateUninitialized(length(), data);
     char_data = reinterpret_cast<char*>(data);
   }
-  uncompressed_string_piece = base::StringPiece(char_data, size);
+  uncompressed_string_piece = std::string_view(char_data, size);
 
   switch (GetCompressionAlgorithm()) {
     case CompressionAlgorithm::kZlib: {
@@ -759,8 +760,8 @@
   // Compression touches the string.
   AsanUnpoisonString(params->string->string_);
   bool ok;
-  base::StringPiece data(reinterpret_cast<const char*>(params->data.get()),
-                         params->size);
+  std::string_view data(reinterpret_cast<const char*>(params->data.get()),
+                        params->size);
   std::unique_ptr<Vector<uint8_t>> compressed;
 
   // This runs in background, making CPU starvation likely, and not an issue.
diff --git a/third_party/blink/renderer/platform/exported/file_path_conversion.cc b/third_party/blink/renderer/platform/exported/file_path_conversion.cc
index 78928f45..bb9cfac 100644
--- a/third_party/blink/renderer/platform/exported/file_path_conversion.cc
+++ b/third_party/blink/renderer/platform/exported/file_path_conversion.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/public/platform/file_path_conversion.h"
 
+#include <string_view>
+
 #include "base/files/file_path.h"
 #include "build/build_config.h"
 #include "third_party/blink/public/platform/web_string.h"
@@ -18,12 +20,12 @@
 
   if (!str.Is8Bit()) {
     return base::FilePath::FromUTF16Unsafe(
-        base::StringPiece16(str.Characters16(), str.length()));
+        std::u16string_view(str.Characters16(), str.length()));
   }
 
 #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
   StringUTF8Adaptor utf8(str);
-  return base::FilePath::FromUTF8Unsafe(utf8.AsStringPiece());
+  return base::FilePath::FromUTF8Unsafe(utf8.AsStringView());
 #else
   const LChar* data8 = str.Characters8();
   return base::FilePath::FromUTF16Unsafe(
diff --git a/third_party/blink/renderer/platform/exported/url_conversion.cc b/third_party/blink/renderer/platform/exported/url_conversion.cc
index 70c3eec80..6df79e19 100644
--- a/third_party/blink/renderer/platform/exported/url_conversion.cc
+++ b/third_party/blink/renderer/platform/exported/url_conversion.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/public/platform/url_conversion.h"
 
+#include <string_view>
+
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
@@ -19,11 +21,11 @@
   if (str.Is8Bit()) {
     // Ensure the (possibly Latin-1) 8-bit string is UTF-8 for GURL.
     StringUTF8Adaptor utf8(str);
-    return GURL(utf8.AsStringPiece());
+    return GURL(utf8.AsStringView());
   }
 
   // GURL can consume UTF-16 directly.
-  return GURL(base::StringPiece16(str.Characters16(), str.length()));
+  return GURL(std::u16string_view(str.Characters16(), str.length()));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/geometry/float_rounded_rect.h b/third_party/blink/renderer/platform/geometry/float_rounded_rect.h
index 9eb05f2..09a7c21 100644
--- a/third_party/blink/renderer/platform/geometry/float_rounded_rect.h
+++ b/third_party/blink/renderer/platform/geometry/float_rounded_rect.h
@@ -50,7 +50,7 @@
 namespace blink {
 
 // Represents a rect with rounded corners.
-// We don't use gfx::RRect in blink because gfx::RRect is based on SkRRect
+// We don't use gfx::RRectF in blink because gfx::RRectF is based on SkRRect
 // which always keeps the radii constrained within the size of the rect, but
 // in blink sometimes we need to keep the unconstrained status of a rounded
 // rect. See ConstrainRadii(). This class also provides functions that are
diff --git a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc
index d96f8c7..3d67a79 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc
@@ -19,12 +19,19 @@
       transform_(gfx::Transform::MakeTranslation(-layer_offset)) {}
 
 void ChunkToLayerMapper::SwitchToChunk(const PaintChunk& chunk) {
+  SwitchToChunkWithState(chunk,
+                         chunk.properties.GetPropertyTreeState().Unalias());
+}
+
+void ChunkToLayerMapper::SwitchToChunkWithState(
+    const PaintChunk& chunk,
+    const PropertyTreeState& new_chunk_state) {
   raster_effect_outset_ = chunk.raster_effect_outset;
 
-  const auto& new_chunk_state =
-      chunk.properties.GetPropertyTreeState().Unalias();
-  if (new_chunk_state == chunk_state_)
+  DCHECK_EQ(new_chunk_state, chunk.properties.GetPropertyTreeState().Unalias());
+  if (new_chunk_state == chunk_state_) {
     return;
+  }
 
   if (new_chunk_state == layer_state_) {
     has_filter_that_moves_pixels_ = false;
diff --git a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.h b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.h
index e7ef9f0..97866d7 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.h
+++ b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.h
@@ -24,9 +24,13 @@
   ChunkToLayerMapper(const PropertyTreeState& layer_state,
                      const gfx::Vector2dF& layer_offset);
 
+  const PropertyTreeState& LayerState() const { return layer_state_; }
+  gfx::Vector2dF LayerOffset() const { return layer_offset_; }
+
   // This class can map from multiple chunks. Before mapping from a chunk, this
   // method must be called to prepare for the chunk.
   void SwitchToChunk(const PaintChunk&);
+  void SwitchToChunkWithState(const PaintChunk&, const PropertyTreeState&);
 
   const PropertyTreeState& ChunkState() const { return chunk_state_; }
 
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
index 137cbd3..04e54dfa 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
@@ -737,20 +737,21 @@
     synthesized_clip.Layer()->SetLayerTreeHost(root_layer_->layer_tree_host());
     if (layer_debug_info_enabled_ && !synthesized_clip.Layer()->debug_info())
       synthesized_clip.Layer()->SetDebugName("Synthesized Clip");
+  }
 
-    if (!should_always_update_on_scroll_) {
-      // If there is any scroll translation between `clip.LocalTransformSpace`
-      // and `transform`, the synthesized clip layer's geometry and paint
-      // operations depend on the scroll offset and we need to update them
-      // on each scroll of the scroller.
-      const auto& clip_transform = clip.LocalTransformSpace().Unalias();
-      if (&clip_transform != &transform &&
-          &clip_transform.NearestScrollTranslationNode() !=
-              &transform.NearestScrollTranslationNode()) {
-        should_always_update_on_scroll_ = true;
-      }
+  if (!should_always_update_on_scroll_) {
+    // If there is any scroll translation between `clip.LocalTransformSpace`
+    // and `transform`, the synthesized clip's fast rounded border or layer
+    // geometry and paint operations depend on the scroll offset and we need to
+    // update them on each scroll of the scroller.
+    const auto& clip_transform = clip.LocalTransformSpace().Unalias();
+    if (&clip_transform != &transform &&
+        &clip_transform.NearestScrollTranslationNode() !=
+            &transform.NearestScrollTranslationNode()) {
+      should_always_update_on_scroll_ = true;
     }
   }
+
   mask_isolation_id = synthesized_clip.GetMaskIsolationId();
   mask_effect_id = synthesized_clip.GetMaskEffectId();
   return synthesized_clip;
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
index 82ddc3d0..c0c0909 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
@@ -3677,23 +3677,21 @@
   Update(artifact.Build());
 
   // Expectation in effect stack diagram:
-  //                     content1
-  //       content0      [  e1  ]  clip_mask1        content2
-  // [ mask_isolation_0 ][  mask_isolation_1  ][ mask_isolation_2  ]
-  // [                             e0                              ]
+  //                           content1
+  //       content0      [        e1        ]      content2
+  // [ mask_isolation_0 ][ mask_isolation_1 ][ mask_isolation_2  ]
+  // [                            e0                             ]
   // Three content layers.
-  ASSERT_EQ(4u, LayerCount());
+  ASSERT_EQ(3u, LayerCount());
   const cc::Layer* content0 = LayerAt(0);
   const cc::Layer* content1 = LayerAt(1);
-  const cc::Layer* clip_mask1 = LayerAt(2);
-  const cc::Layer* content2 = LayerAt(3);
+  const cc::Layer* content2 = LayerAt(2);
 
-  // Three synthesized layers, two of which are null because they use fast
-  // rounded corners. One real synthesized layer is needed because the rounded
-  // clip and the backdrop filter are in different transform spaces.
+  // Three synthesized layers, all are null because they use fast rounded
+  // corners.
   ASSERT_EQ(3u, SynthesizedClipLayerCount());
   EXPECT_FALSE(SynthesizedClipLayerAt(0));
-  EXPECT_EQ(clip_mask1, SynthesizedClipLayerAt(1));
+  EXPECT_FALSE(SynthesizedClipLayerAt(1));
   EXPECT_FALSE(SynthesizedClipLayerAt(2));
 
   int t1_id = content0->transform_tree_index();
@@ -3737,24 +3735,12 @@
   EXPECT_EQ(t1_id, mask_isolation_1.transform_id);
   EXPECT_EQ(c2_id, mask_isolation_1.clip_id);
   EXPECT_FALSE(mask_isolation_1.backdrop_filters.IsEmpty());
-  EXPECT_FALSE(mask_isolation_1.is_fast_rounded_corner);
+  EXPECT_TRUE(mask_isolation_1.is_fast_rounded_corner);
   // Opacity should also be moved to mask_isolation_1.
   EXPECT_EQ(0.5f, mask_isolation_1.opacity);
-  EXPECT_EQ(gfx::RRectF(),
+  EXPECT_EQ(gfx::RRectF(40, 30, 300, 200, 5),
             mask_isolation_1.mask_filter_info.rounded_corner_bounds());
 
-  EXPECT_EQ(t1_id, clip_mask1->transform_tree_index());
-  EXPECT_EQ(c2_id, clip_mask1->clip_tree_index());
-  const cc::EffectNode& mask =
-      *GetPropertyTrees().effect_tree().Node(clip_mask1->effect_tree_index());
-  ASSERT_EQ(mask_isolation_1_id, mask.parent_id);
-  EXPECT_EQ(SkBlendMode::kDstIn, mask.blend_mode);
-  EXPECT_TRUE(static_cast<const cc::PictureLayer*>(clip_mask1)
-                  ->is_backdrop_filter_mask());
-  EXPECT_TRUE(clip_mask1->element_id());
-  EXPECT_EQ(clip_mask1->element_id(),
-            mask_isolation_1.backdrop_mask_element_id);
-
   EXPECT_EQ(t1_id, content2->transform_tree_index());
   EXPECT_EQ(c1_id, content2->clip_tree_index());
   int mask_isolation_2_id = content2->effect_tree_index();
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
index ff93ff5..83627dd 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
@@ -55,12 +55,10 @@
   ConversionContext(const PropertyTreeState& layer_state,
                     const gfx::Vector2dF& layer_offset,
                     Result& result)
-      : layer_state_(layer_state),
-        layer_offset_(layer_offset),
+      : chunk_to_layer_mapper_(layer_state, layer_offset),
         current_transform_(&layer_state.Transform()),
         current_clip_(&layer_state.Clip()),
         current_effect_(&layer_state.Effect()),
-        chunk_to_layer_mapper_(layer_state_, layer_offset_),
         result_(result) {}
   ~ConversionContext();
 
@@ -114,15 +112,12 @@
                const gfx::Rect* additional_cull_rect = nullptr);
 
  private:
+  bool HasDrawing(PaintChunkIterator, const PropertyTreeState&) const;
+
   // Adjust the translation of the whole display list relative to layer offset.
   // It's only called if we actually paint anything.
   void TranslateForLayerOffsetOnce();
 
-  // Switch the current property tree state to the chunk's state. It's only
-  // called if we actually paint anything, and should execute for a chunk
-  // only once.
-  void SwitchToChunkState(const PaintChunk&);
-
   // Switch the current clip to the target state, staying in the same effect.
   // It is no-op if the context is already in the target state.
   // Otherwise zero or more clips will be popped from or pushed onto the
@@ -239,16 +234,18 @@
     // RAW_PTR_EXCLUSION: Performance reasons: regressions in MotionMark
     // (crbug.com/1495275#c116). The struct is performance critical and stack
     // scoped.
+    // These fields are never nullptr. They save ConversionContext::
+    // current_transform_, current_clip_ and current_effect_, respectively.
     RAW_PTR_EXCLUSION const TransformPaintPropertyNode* transform;
     // RAW_PTR_EXCLUSION: The struct is performance critical and stack scoped.
     RAW_PTR_EXCLUSION const ClipPaintPropertyNode* clip;
     // RAW_PTR_EXCLUSION: The struct is performance critical and stack scoped.
     RAW_PTR_EXCLUSION const EffectPaintPropertyNode* effect;
-    // See ConversionContext<Result>::previous_transform_.
+    // This saves ConversionContext::previous_transform_.
     // RAW_PTR_EXCLUSION: The struct is performance critical and stack scoped.
     RAW_PTR_EXCLUSION const TransformPaintPropertyNode* previous_transform;
 #if DCHECK_IS_ON()
-    bool has_pre_cap_effect_hierarchy_issue = false;
+    bool has_effect_hierarchy_issue = false;
 #endif
 
    private:
@@ -258,8 +255,8 @@
   void PopState();
   Vector<StateEntry> state_stack_;
 
-  const PropertyTreeState& layer_state_;
-  const gfx::Vector2dF layer_offset_;
+  ChunkToLayerMapper chunk_to_layer_mapper_;
+
   bool translated_for_layer_offset_ = false;
 
   // These fields are never nullptr.
@@ -295,8 +292,6 @@
   };
   Vector<EffectBoundsInfo> effect_bounds_stack_;
 
-  ChunkToLayerMapper chunk_to_layer_mapper_;
-
   Result& result_;
 };
 
@@ -316,27 +311,18 @@
 
 template <typename Result>
 void ConversionContext<Result>::TranslateForLayerOffsetOnce() {
-  if (translated_for_layer_offset_ || layer_offset_ == gfx::Vector2dF())
+  gfx::Vector2dF layer_offset = chunk_to_layer_mapper_.LayerOffset();
+  if (translated_for_layer_offset_ || layer_offset == gfx::Vector2dF()) {
     return;
+  }
 
   result_.StartPaint();
   push<cc::SaveOp>();
-  push<cc::TranslateOp>(-layer_offset_.x(), -layer_offset_.y());
+  push<cc::TranslateOp>(-layer_offset.x(), -layer_offset.y());
   result_.EndPaintOfPairedBegin();
   translated_for_layer_offset_ = true;
 }
 
-template <typename Result>
-void ConversionContext<Result>::SwitchToChunkState(const PaintChunk& chunk) {
-  TranslateForLayerOffsetOnce();
-  chunk_to_layer_mapper_.SwitchToChunk(chunk);
-
-  const auto& chunk_state = chunk.properties;
-  SwitchToEffect(chunk_state.Effect().Unalias());
-  SwitchToClip(chunk_state.Clip().Unalias());
-  SwitchToTransform(chunk_state.Transform().Unalias());
-}
-
 // Tries to combine a clip node's clip rect into |combined_clip_rect|.
 // Returns whether the clip has been combined.
 static bool CombineClip(const ClipPaintPropertyNode& clip,
@@ -345,18 +331,20 @@
     return true;
 
   // Don't combine into a clip with clip path.
-  DCHECK(clip.Parent());
-  if (clip.UnaliasedParent()->ClipPath())
+  const auto* parent = clip.UnaliasedParent();
+  CHECK(parent);
+  if (parent->ClipPath()) {
     return false;
+  }
 
   // Don't combine clips in different transform spaces.
   const auto& transform_space = clip.LocalTransformSpace().Unalias();
-  const auto& parent_transform_space =
-      clip.UnaliasedParent()->LocalTransformSpace().Unalias();
+  const auto& parent_transform_space = parent->LocalTransformSpace().Unalias();
   if (&transform_space != &parent_transform_space &&
       (transform_space.Parent() != &parent_transform_space ||
-       !transform_space.IsIdentity()))
+       !transform_space.IsIdentity())) {
     return false;
+  }
 
   // Don't combine two rounded clip rects.
   bool clip_is_rounded = clip.PaintClipRect().IsRounded();
@@ -391,32 +379,35 @@
     return;
 
   // Step 1: Exit all clips until the lowest common ancestor is found.
-  const auto* lca_clip =
-      &target_clip.LowestCommonAncestor(*current_clip_).Unalias();
-  while (current_clip_ != lca_clip) {
-    if (!state_stack_.size() || !state_stack_.back().IsClip()) {
-      // TODO(crbug.com/803649): We still have clip hierarchy issues with
-      // fragment clips. See crbug.com/1240080 for the test case. Will change
-      // the above condition to DCHECK after LayoutNGBlockFragmentation is fully
-      // launched.
+  {
+    const auto* lca_clip =
+        &target_clip.LowestCommonAncestor(*current_clip_).Unalias();
+    const auto* clip = current_clip_;
+    while (clip != lca_clip) {
+      if (!state_stack_.size() || !state_stack_.back().IsClip()) {
+        // TODO(crbug.com/40558824): We still have clip hierarchy issues.
+        // See crbug.com/40558824#comment57 for the test case.
 #if DCHECK_IS_ON()
-      DLOG(ERROR) << "Error: Chunk has a clip that escaped its layer's or "
-                  << "effect's clip.\ntarget_clip:\n"
-                  << target_clip.ToTreeString().Utf8() << "current_clip_:\n"
-                  << current_clip_->ToTreeString().Utf8();
+        DLOG(ERROR) << "Error: Chunk has a clip that escaped its layer's or "
+                    << "effect's clip.\ntarget_clip:\n"
+                    << target_clip.ToTreeString().Utf8() << "current_clip_:\n"
+                    << clip->ToTreeString().Utf8();
 #endif
-      break;
+        break;
+      }
+      DCHECK(clip->Parent());
+      clip = &clip->Parent()->Unalias();
+      StateEntry& previous_state = state_stack_.back();
+      if (clip == lca_clip) {
+        // |lca_clip| may be an intermediate clip in a series of combined clips.
+        // Jump to the first of the combined clips.
+        clip = lca_clip = previous_state.clip;
+      }
+      if (clip == previous_state.clip) {
+        EndClip();
+        DCHECK_EQ(current_clip_, clip);
+      }
     }
-    DCHECK(current_clip_->Parent());
-    current_clip_ = &current_clip_->Parent()->Unalias();
-    StateEntry& previous_state = state_stack_.back();
-    if (current_clip_ == lca_clip) {
-      // |lca_clip| is an intermediate clip in a series of combined clips.
-      // Jump to the first of the combined clips.
-      current_clip_ = lca_clip = previous_state.clip;
-    }
-    if (current_clip_ == previous_state.clip)
-      EndClip();
   }
 
   if (&target_clip == current_clip_)
@@ -517,10 +508,8 @@
     // This EndClips() and the later EndEffect() pop to the parent effect.
     EndClips();
     if (!state_stack_.size()) {
-      // TODO(crbug.com/803649): We still have clip hierarchy issues with
-      // fragment clips. See crbug.com/1240080 for the test case. Will change
-      // the above condition to DCHECK after LayoutNGBlockFragmentation is fully
-      // launched.
+      // TODO(crbug.com/40558824): We still have clip hierarchy issues.
+      // See crbug.com/40558824#comment57 for the test case.
 #if DCHECK_IS_ON()
       DLOG(ERROR) << "Error: Chunk has an effect that escapes layer's effect.\n"
                   << "target_effect:\n"
@@ -528,12 +517,11 @@
                   << current_effect_->ToTreeString().Utf8();
       has_effect_hierarchy_issue = true;
 #endif
-      // In pre-CompositeAfterPaint, we may squash one layer into another, but
-      // the squashing layer may create more effect nodes not for real effects,
-      // causing squashed layer's effect to escape the squashing layer's effect.
-      // We can continue because the extra effects are noop.
-      if (!HasRealEffects(*current_effect_, lca_effect))
+      // We can continue if the extra effects causing the clip hierarchy issue
+      // are no-op.
+      if (!HasRealEffects(*current_effect_, lca_effect)) {
         break;
+      }
       return;
     }
     EndEffect();
@@ -559,8 +547,7 @@
 #endif
     StartEffect(*sub_effect);
 #if DCHECK_IS_ON()
-    state_stack_.back().has_pre_cap_effect_hierarchy_issue =
-        has_effect_hierarchy_issue;
+    state_stack_.back().has_effect_hierarchy_issue = has_effect_hierarchy_issue;
     // This applies only to the first new effect.
     has_effect_hierarchy_issue = false;
 #endif
@@ -667,8 +654,9 @@
 #if DCHECK_IS_ON()
   const auto& previous_state = state_stack_.back();
   DCHECK(previous_state.IsEffect());
-  if (!previous_state.has_pre_cap_effect_hierarchy_issue)
+  if (!previous_state.has_effect_hierarchy_issue) {
     DCHECK_EQ(current_effect_->UnaliasedParent(), previous_state.effect);
+  }
   DCHECK_EQ(current_clip_, previous_state.clip);
 #endif
 
@@ -772,20 +760,52 @@
 }
 
 template <typename Result>
+bool ConversionContext<Result>::HasDrawing(
+    PaintChunkIterator chunk_it,
+    const PropertyTreeState& chunk_state) const {
+  // If we have an empty paint chunk, then we would prefer ignoring it.
+  // However, a reference filter can generate visible effect from invisible
+  // source, and we need to emit paint operations for it.
+  if (&chunk_state.Effect() != current_effect_) {
+    return true;
+  }
+  DisplayItemRange items = chunk_it.DisplayItems();
+  if (items.size() == 0) {
+    return false;
+  }
+  if (items.size() > 1) {
+    // Assume the chunk has drawing if it has more than one display items.
+    return true;
+  }
+  if (auto* drawing = DynamicTo<DrawingDisplayItem>(*items.begin())) {
+    if (drawing->GetPaintRecord().empty() &&
+        // See can_ignore_record in Convert()'s inner loop.
+        &chunk_state.Effect() == &EffectPaintPropertyNode::Root()) {
+      return false;
+    }
+  }
+  return true;
+}
+
+template <typename Result>
 void ConversionContext<Result>::Convert(const PaintChunkSubset& chunks,
                                         const gfx::Rect* additional_cull_rect) {
   for (auto it = chunks.begin(); it != chunks.end(); ++it) {
     const auto& chunk = *it;
-    if (chunk.effectively_invisible)
+    if (chunk.effectively_invisible) {
       continue;
-    const auto& chunk_state = chunk.properties;
-    bool switched_to_chunk_state = false;
+    }
+
+    PropertyTreeState chunk_state =
+        chunk.properties.GetPropertyTreeState().Unalias();
+    if (!HasDrawing(it, chunk_state)) {
+      continue;
+    }
+
+    TranslateForLayerOffsetOnce();
+    chunk_to_layer_mapper_.SwitchToChunkWithState(chunk, chunk_state);
 
     if (additional_cull_rect) {
-      // `SwitchToChunkState` will also update `chunk_to_layer_mapper_`'s chunk
-      // but we need to explicitly switch the state ahead of time to ensure the
-      // call to `chunk_to_layer_mapper_.MapVisualRect` uses the correct state.
-      chunk_to_layer_mapper_.SwitchToChunk(chunk);
       gfx::Rect chunk_visual_rect =
           chunk_to_layer_mapper_.MapVisualRect(chunk.drawable_bounds);
       if (additional_cull_rect &&
@@ -794,14 +814,19 @@
       }
     }
 
+    SwitchToEffect(chunk_state.Effect());
+    SwitchToClip(chunk_state.Clip());
+    SwitchToTransform(chunk_state.Transform());
+
     for (const auto& item : it.DisplayItems()) {
       PaintRecord record;
-      if (auto* scrollbar = DynamicTo<ScrollbarDisplayItem>(item))
+      if (auto* scrollbar = DynamicTo<ScrollbarDisplayItem>(item)) {
         record = scrollbar->Paint();
-      else if (auto* drawing = DynamicTo<DrawingDisplayItem>(item))
+      } else if (auto* drawing = DynamicTo<DrawingDisplayItem>(item)) {
         record = drawing->GetPaintRecord();
-      else
+      } else {
         continue;
+      }
 
       // If we have an empty paint record, then we would prefer ignoring it.
       // However, if we also have a non-root effect, the empty paint record
@@ -814,11 +839,6 @@
         continue;
       }
 
-      if (!switched_to_chunk_state) {
-        SwitchToChunkState(chunk);
-        switched_to_chunk_state = true;
-      }
-
       gfx::Rect visual_rect =
           chunk_to_layer_mapper_.MapVisualRect(item.VisualRect());
       if (additional_cull_rect && can_ignore_record &&
@@ -833,17 +853,11 @@
       result_.EndPaintOfUnpaired(visual_rect);
     }
 
-    // If we have an empty paint chunk, then we would prefer ignoring it.
-    // However, a reference filter can generate visible effect from invisible
-    // source, and we need to emit paint operations for it.
-    if (!switched_to_chunk_state && &chunk_state.Effect() != current_effect_)
-      SwitchToChunkState(chunk);
-
     // Most effects apply to drawable contents only. Reference filters are
     // exceptions, for which we have already added the chunk bounds mapped
     // through the filter to the bounds of the effect in StartEffect().
     UpdateEffectBounds(gfx::RectF(chunk.drawable_bounds),
-                       chunk_state.Transform().Unalias());
+                       chunk_state.Transform());
   }
 }
 
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
index 78e248dc..a7066a2c 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
@@ -889,22 +889,17 @@
   }
 }
 
-bool PropertyTreeManager::SupportsShaderBasedRoundedCorner(
+std::optional<gfx::RRectF> PropertyTreeManager::ShaderBasedRRect(
     const ClipPaintPropertyNode& clip,
     PropertyTreeManager::CcEffectType type,
+    const TransformPaintPropertyNode& transform,
     const EffectPaintPropertyNode* next_effect) {
-  if (type & CcEffectType::kSyntheticFor2dAxisAlignment)
-    return false;
-
-  if (clip.ClipPath())
-    return false;
-
-  // Don't use shader based rounded corner if the next effect has backdrop
-  // filter and the clip is in different transform space, because we will use
-  // the effect's transform space for the mask isolation effect node.
-  if (next_effect && next_effect->BackdropFilter() &&
-      &next_effect->LocalTransformSpace() != &clip.LocalTransformSpace())
-    return false;
+  if (type & CcEffectType::kSyntheticFor2dAxisAlignment) {
+    return std::nullopt;
+  }
+  if (clip.ClipPath()) {
+    return std::nullopt;
+  }
 
   auto WidthAndHeightAreTheSame = [](const gfx::SizeF& size) {
     return size.width() == size.height();
@@ -915,7 +910,7 @@
       !WidthAndHeightAreTheSame(radii.TopRight()) ||
       !WidthAndHeightAreTheSame(radii.BottomRight()) ||
       !WidthAndHeightAreTheSame(radii.BottomLeft())) {
-    return false;
+    return std::nullopt;
   }
 
   // Rounded corners that differ are not supported by the CALayerOverlay system
@@ -926,11 +921,26 @@
   if (radii.TopLeft() != radii.TopRight() ||
       radii.TopLeft() != radii.BottomRight() ||
       radii.TopLeft() != radii.BottomLeft()) {
-    return false;
+    return std::nullopt;
   }
 #endif
 
-  return true;
+  gfx::Vector2dF translation;
+  if (&transform != &clip.LocalTransformSpace()) {
+    gfx::Transform projection = GeometryMapper::SourceToDestinationProjection(
+        clip.LocalTransformSpace(), transform);
+    if (!projection.IsIdentityOr2dTranslation()) {
+      return std::nullopt;
+    }
+    translation = projection.To2dTranslation();
+  }
+
+  SkRRect rrect(clip.PaintClipRect());
+  rrect.offset(translation.x(), translation.y());
+  if (!rrect.isValid()) {
+    return std::nullopt;
+  }
+  return gfx::RRectF(rrect);
 }
 
 int PropertyTreeManager::SynthesizeCcEffectsForClipsIfNeeded(
@@ -1008,6 +1018,11 @@
     cc::EffectNode& synthetic_effect = *effect_tree_.Node(
         effect_tree_.Insert(cc::EffectNode(), current_.effect_id));
 
+    const auto& transform =
+        should_realize_backdrop_effect
+            ? next_effect->LocalTransformSpace().Unalias()
+            : pending_clip.clip->LocalTransformSpace().Unalias();
+
     if (pending_clip.type & CcEffectType::kSyntheticFor2dAxisAlignment) {
       if (should_realize_backdrop_effect) {
         // We need a synthetic mask clip layer for the non-2d-axis-aligned clip
@@ -1048,10 +1063,9 @@
       // For non-trivial clip, isolation_effect.element_id will be assigned
       // later when the effect is closed. For now the default value ElementId()
       // is used. See PropertyTreeManager::EmitClipMaskLayer().
-      if (SupportsShaderBasedRoundedCorner(*pending_clip.clip,
-                                           pending_clip.type, next_effect)) {
-        synthetic_effect.mask_filter_info = gfx::MaskFilterInfo(
-            gfx::RRectF(SkRRect(pending_clip.clip->PaintClipRect())));
+      if (std::optional<gfx::RRectF> rrect = ShaderBasedRRect(
+              *pending_clip.clip, pending_clip.type, transform, next_effect)) {
+        synthetic_effect.mask_filter_info = gfx::MaskFilterInfo(*rrect);
         synthetic_effect.is_fast_rounded_corner = true;
 
         // Nested rounded corner clips need to force render surfaces for
@@ -1079,28 +1093,25 @@
       pending_synthetic_mask_layers_.insert(synthetic_effect.id);
     }
 
-    const TransformPaintPropertyNode* transform = nullptr;
     if (should_realize_backdrop_effect) {
       // Move the effect node containing backdrop effects up to the outermost
       // synthetic effect to ensure the backdrop effects can access the correct
       // backdrop.
       DCHECK(next_effect);
       DCHECK_EQ(cc_effect_id_for_backdrop_effect, cc::kInvalidPropertyNodeId);
-      transform = &next_effect->LocalTransformSpace().Unalias();
       PopulateCcEffectNode(synthetic_effect, *next_effect, clip_id);
       cc_effect_id_for_backdrop_effect = synthetic_effect.id;
       should_realize_backdrop_effect = false;
     } else {
-      transform = &pending_clip.clip->LocalTransformSpace().Unalias();
       synthetic_effect.clip_id = clip_id;
     }
 
-    synthetic_effect.transform_id = EnsureCompositorTransformNode(*transform);
-    synthetic_effect.double_sided = !transform->IsBackfaceHidden();
+    synthetic_effect.transform_id = EnsureCompositorTransformNode(transform);
+    synthetic_effect.double_sided = !transform.IsBackfaceHidden();
 
     effect_stack_.emplace_back(current_);
     SetCurrentEffectState(synthetic_effect, pending_clip.type, *current_.effect,
-                          *pending_clip.clip, *transform);
+                          *pending_clip.clip, transform);
   }
 
   return cc_effect_id_for_backdrop_effect;
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h
index 1a78b2bf..6464e1e 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h
+++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h
@@ -27,6 +27,7 @@
 
 namespace gfx {
 class PointF;
+class RRectF;
 }
 
 namespace blink {
@@ -214,9 +215,10 @@
     kSyntheticFor2dAxisAlignment = 1 << 1
   };
 
-  static bool SupportsShaderBasedRoundedCorner(
+  static std::optional<gfx::RRectF> ShaderBasedRRect(
       const ClipPaintPropertyNode&,
       CcEffectType type,
+      const TransformPaintPropertyNode& transform,
       const EffectPaintPropertyNode* next_effect);
 
   // Note: EffectState holds direct references to property nodes. Ordinarily it
diff --git a/third_party/blink/renderer/platform/instrumentation/tracing/traced_value.cc b/third_party/blink/renderer/platform/instrumentation/tracing/traced_value.cc
index f889633..06a587e5 100644
--- a/third_party/blink/renderer/platform/instrumentation/tracing/traced_value.cc
+++ b/third_party/blink/renderer/platform/instrumentation/tracing/traced_value.cc
@@ -43,7 +43,7 @@
 
 void TracedValue::SetString(const char* name, const String& value) {
   StringUTF8Adaptor adaptor(value);
-  traced_value_->SetString(name, adaptor.AsStringPiece());
+  traced_value_->SetString(name, adaptor.AsStringView());
 }
 
 void TracedValue::SetValue(const char* name, TracedValue* value) {
@@ -53,7 +53,7 @@
 void TracedValue::SetStringWithCopiedName(const char* name,
                                           const String& value) {
   StringUTF8Adaptor adaptor(value);
-  traced_value_->SetStringWithCopiedName(name, adaptor.AsStringPiece());
+  traced_value_->SetStringWithCopiedName(name, adaptor.AsStringView());
 }
 
 void TracedValue::BeginDictionary(const char* name) {
@@ -90,7 +90,7 @@
 
 void TracedValue::PushString(const String& value) {
   StringUTF8Adaptor adaptor(value);
-  traced_value_->AppendString(adaptor.AsStringPiece());
+  traced_value_->AppendString(adaptor.AsStringView());
 }
 
 void TracedValue::BeginArray() {
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index 0cb5c2bd..3cc2c38 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -31,6 +31,7 @@
 #include <limits>
 #include <optional>
 #include <string>
+#include <string_view>
 #include <utility>
 
 #include "base/auto_reset.h"
@@ -2912,7 +2913,7 @@
 // The followings should match with `ResourceType` in
 // `third_party/blink/renderer/platform/loader/fetch/resource.h`
 void ResourceFetcher::RecordResourceHistogram(
-    base::StringPiece prefix,
+    std::string_view prefix,
     ResourceType type,
     RevalidationPolicyForMetrics policy) const {
   base::UmaHistogramEnumeration(
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
index ba6ea1e2..0f29dc10 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
@@ -29,9 +29,9 @@
 
 #include <memory>
 #include <optional>
+#include <string_view>
 #include <utility>
 
-#include "base/strings/string_piece.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/unguessable_token.h"
 #include "services/metrics/public/cpp/mojo_ukm_recorder.h"
@@ -562,7 +562,7 @@
       bool handled_by_serviceworker,
       const blink::ServiceWorkerRouterInfo* router_info);
 
-  void RecordResourceHistogram(base::StringPiece prefix,
+  void RecordResourceHistogram(std::string_view prefix,
                                ResourceType type,
                                RevalidationPolicyForMetrics policy) const;
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.h b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.h
index 4618d5f..113e65b 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.h
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.h
@@ -6,7 +6,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_URL_LOADER_DEDICATED_OR_SHARED_WORKER_FETCH_CONTEXT_IMPL_H_
 
 #include "base/memory/raw_ptr.h"
-#include "base/strings/string_piece.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task/single_thread_task_runner.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader_unittest.cc
index ddd06dba..115e8cc 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader_unittest.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.h"
 
+#include <string_view>
+
 #include "base/functional/bind.h"
 #include "base/run_loop.h"
 #include "base/task/single_thread_task_runner.h"
@@ -429,9 +431,9 @@
       {"subjectAltName_sanity_check.pem", "root_ca_cert.pem"}, &certs));
   ASSERT_EQ(2U, certs.size());
 
-  base::StringPiece cert0_der =
+  std::string_view cert0_der =
       net::x509_util::CryptoBufferAsStringPiece(certs[0]->cert_buffer());
-  base::StringPiece cert1_der =
+  std::string_view cert1_der =
       net::x509_util::CryptoBufferAsStringPiece(certs[1]->cert_buffer());
 
   response->ssl_info->cert =
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc
index 14c8189..f4af174b 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.h"
 
+#include <string_view>
+
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/system/data_pipe.h"
@@ -47,13 +49,13 @@
 
 // TODO(yhirano) Dedupe this and the same-name function in
 // web_url_request_util.cc.
-std::string TrimLWSAndCRLF(const base::StringPiece& input) {
-  base::StringPiece string = net::HttpUtil::TrimLWS(input);
+std::string TrimLWSAndCRLF(const std::string_view& input) {
+  std::string_view string = net::HttpUtil::TrimLWS(input);
   const char* begin = string.data();
   const char* end = string.data() + string.size();
   while (begin < end && (end[-1] == '\r' || end[-1] == '\n'))
     --end;
-  return std::string(base::StringPiece(begin, end - begin));
+  return std::string(std::string_view(begin, end - begin));
 }
 
 mojom::ResourceType RequestContextToResourceType(
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_unittest.cc
index 99e4199..0285940e 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_unittest.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_unittest.cc
@@ -2,9 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader.h"
+
 #include <stdint.h>
 #include <string.h>
 
+#include <string_view>
 #include <utility>
 #include <vector>
 
@@ -52,7 +55,6 @@
 #include "third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_client.h"
 #include "third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.h"
 #include "third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_response.h"
-#include "third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader.h"
 #include "third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_client.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
@@ -540,9 +542,9 @@
       {"subjectAltName_sanity_check.pem", "root_ca_cert.pem"}, &certs));
   ASSERT_EQ(2U, certs.size());
 
-  base::StringPiece cert0_der =
+  std::string_view cert0_der =
       net::x509_util::CryptoBufferAsStringPiece(certs[0]->cert_buffer());
-  base::StringPiece cert1_der =
+  std::string_view cert1_der =
       net::x509_util::CryptoBufferAsStringPiece(certs[1]->cert_buffer());
 
   net::SSLInfo ssl_info;
diff --git a/third_party/blink/renderer/platform/loader/link_header.cc b/third_party/blink/renderer/platform/loader/link_header.cc
index f016f79..87aecae 100644
--- a/third_party/blink/renderer/platform/loader/link_header.cc
+++ b/third_party/blink/renderer/platform/loader/link_header.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/platform/loader/link_header.h"
 
+#include <string_view>
+
 #include "base/strings/string_util.h"
 #include "components/link_header_util/link_header_util.h"
 #include "third_party/blink/public/common/web_package/signed_exchange_consts.h"
@@ -19,7 +21,7 @@
 }
 
 static LinkHeader::LinkParameterName ParameterNameFromString(
-    base::StringPiece name) {
+    std::string_view name) {
   if (base::EqualsCaseInsensitiveASCII(name, "rel"))
     return LinkHeader::kLinkParameterRel;
   if (base::EqualsCaseInsensitiveASCII(name, "anchor"))
diff --git a/third_party/blink/renderer/platform/mojo/security_origin_mojom_traits.h b/third_party/blink/renderer/platform/mojo/security_origin_mojom_traits.h
index 0574483..be38d4f 100644
--- a/third_party/blink/renderer/platform/mojo/security_origin_mojom_traits.h
+++ b/third_party/blink/renderer/platform/mojo/security_origin_mojom_traits.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_MOJO_SECURITY_ORIGIN_MOJOM_TRAITS_H_
 
 #include <optional>
+#include <string_view>
 
 #include "mojo/public/cpp/base/unguessable_token_mojom_traits.h"
 #include "mojo/public/cpp/bindings/optional_as_pointer.h"
@@ -70,8 +71,8 @@
     // This implementation is very close to
     // SecurityOrigin::CreateFromUrlOrigin, so keep in sync if modifications
     // are made in that method.
-    base::StringPiece scheme;
-    base::StringPiece host;
+    std::string_view scheme;
+    std::string_view host;
     std::optional<base::UnguessableToken> nonce_if_opaque;
     if (!data.ReadScheme(&scheme) || !data.ReadHost(&host) ||
         !data.ReadNonceIfOpaque(&nonce_if_opaque))
diff --git a/third_party/blink/renderer/platform/network/http_parsers.cc b/third_party/blink/renderer/platform/network/http_parsers.cc
index 9342d36c..8182059 100644
--- a/third_party/blink/renderer/platform/network/http_parsers.cc
+++ b/third_party/blink/renderer/platform/network/http_parsers.cc
@@ -35,6 +35,7 @@
 #include <memory>
 #include <optional>
 #include <string>
+#include <string_view>
 #include <utility>
 
 #include "base/containers/flat_map.h"
@@ -788,7 +789,7 @@
   for (const AtomicString& header : ReplaceHeaders()) {
     std::string value;
     StringUTF8Adaptor adaptor(header);
-    base::StringPiece header_string_piece(adaptor.AsStringPiece());
+    std::string_view header_string_piece(adaptor.AsStringView());
     size_t iterator = 0;
 
     response->ClearHttpHeaderField(header);
@@ -831,7 +832,7 @@
   for (const AtomicString* headerNamePointer : headerNamePointers) {
     StringUTF8Adaptor adaptor(*headerNamePointer);
     size_t iterator = 0;
-    base::StringPiece headerNameStringPiece = adaptor.AsStringPiece();
+    std::string_view headerNameStringPiece = adaptor.AsStringView();
     std::string value;
     while (responseHeaders->EnumerateHeader(&iterator, headerNameStringPiece,
                                             &value)) {
@@ -847,7 +848,7 @@
                                    int64_t* last_byte_position,
                                    int64_t* instance_length) {
   return net::HttpUtil::ParseContentRangeHeaderFor206(
-      StringUTF8Adaptor(content_range).AsStringPiece(), first_byte_position,
+      StringUTF8Adaptor(content_range).AsStringView(), first_byte_position,
       last_byte_position, instance_length);
 }
 
diff --git a/third_party/blink/renderer/platform/network/http_parsers_test.cc b/third_party/blink/renderer/platform/network/http_parsers_test.cc
index 623cef0..d9a97145 100644
--- a/third_party/blink/renderer/platform/network/http_parsers_test.cc
+++ b/third_party/blink/renderer/platform/network/http_parsers_test.cc
@@ -4,7 +4,8 @@
 
 #include "third_party/blink/renderer/platform/network/http_parsers.h"
 
-#include "base/strings/string_piece.h"
+#include <string_view>
+
 #include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "net/base/features.h"
@@ -873,7 +874,7 @@
 
 class NoVarySearchPrefetchDisabledTest
     : public ::testing::Test,
-      public ::testing::WithParamInterface<base::StringPiece> {
+      public ::testing::WithParamInterface<std::string_view> {
  public:
   NoVarySearchPrefetchDisabledTest() {
     scoped_feature_list_.InitAndDisableFeature(
@@ -892,7 +893,7 @@
   EXPECT_FALSE(parsed_headers->no_vary_search_with_parse_error);
 }
 
-constexpr base::StringPiece no_vary_search_prefetch_disabled_data[] = {
+constexpr std::string_view no_vary_search_prefetch_disabled_data[] = {
     // No No-Vary-Search header.
     "HTTP/1.1 200 OK\r\n"
     "Set-Cookie: a\r\n"
@@ -911,7 +912,7 @@
 TEST(NoVarySearchPrefetchEnabledTest, ParsingNVSReturnsDefaultURLVariance) {
   base::test::ScopedFeatureList feature_list(
       network::features::kPrefetchNoVarySearch);
-  const base::StringPiece headers =
+  const std::string_view headers =
       "HTTP/1.1 200 OK\r\n"
       "Set-Cookie: a\r\n"
       "Set-Cookie: b\r\n\r\n";
diff --git a/third_party/blink/renderer/platform/network/network_utils.cc b/third_party/blink/renderer/platform/network/network_utils.cc
index 65137257..b5188df 100644
--- a/third_party/blink/renderer/platform/network/network_utils.cc
+++ b/third_party/blink/renderer/platform/network/network_utils.cc
@@ -47,15 +47,16 @@
 bool IsReservedIPAddress(const String& host) {
   net::IPAddress address;
   StringUTF8Adaptor utf8(host);
-  if (!net::ParseURLHostnameToAddress(utf8.AsStringPiece(), &address))
+  if (!net::ParseURLHostnameToAddress(utf8.AsStringView(), &address)) {
     return false;
+  }
   return !address.IsPubliclyRoutable();
 }
 
 String GetDomainAndRegistry(const String& host, PrivateRegistryFilter filter) {
   StringUTF8Adaptor host_utf8(host);
   std::string domain = net::registry_controlled_domains::GetDomainAndRegistry(
-      host_utf8.AsStringPiece(), getNetPrivateRegistryFilter(filter));
+      host_utf8.AsStringView(), getNetPrivateRegistryFilter(filter));
   return String(domain.data(), domain.length());
 }
 
diff --git a/third_party/blink/renderer/platform/peerconnection/fake_connection_test_base.h b/third_party/blink/renderer/platform/peerconnection/fake_connection_test_base.h
index 153ada79..dde1b1a 100644
--- a/third_party/blink/renderer/platform/peerconnection/fake_connection_test_base.h
+++ b/third_party/blink/renderer/platform/peerconnection/fake_connection_test_base.h
@@ -5,14 +5,13 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_PEERCONNECTION_FAKE_CONNECTION_TEST_BASE_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_PEERCONNECTION_FAKE_CONNECTION_TEST_BASE_H_
 
-#include "base/strings/string_piece.h"
+#include <string_view>
+
 #include "base/synchronization/waitable_event.h"
 #include "base/test/task_environment.h"
 #include "components/webrtc/thread_wrapper.h"
 #include "testing/gtest/include/gtest/gtest.h"
-
 #include "third_party/webrtc/p2p/base/connection.h"
-
 #include "third_party/webrtc_overrides/p2p/base/fake_connection_factory.h"
 
 namespace blink {
@@ -33,7 +32,7 @@
     ready.Wait();
   }
 
-  const ::cricket::Connection* GetConnection(base::StringPiece remote_ip,
+  const ::cricket::Connection* GetConnection(std::string_view remote_ip,
                                              int remote_port) {
     return connection_factory_->CreateConnection(
         webrtc::IceCandidateType::kHost, remote_ip, remote_port);
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc b/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc
index f0ae3a1..2967a73 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc
@@ -12,7 +12,6 @@
 #include "base/check_op.h"
 #include "base/containers/contains.h"
 #include "base/numerics/safe_conversions.h"
-#include "base/strings/string_piece.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
 #include "third_party/blink/public/common/features.h"
diff --git a/third_party/blink/renderer/platform/region_capture_crop_id.cc b/third_party/blink/renderer/platform/region_capture_crop_id.cc
index 305c840..8f00ef3 100644
--- a/third_party/blink/renderer/platform/region_capture_crop_id.cc
+++ b/third_party/blink/renderer/platform/region_capture_crop_id.cc
@@ -7,10 +7,10 @@
 #include <inttypes.h>
 
 #include <string>
+#include <string_view>
 
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 
@@ -30,7 +30,7 @@
   base::RemoveChars(lowercase, "-", &lowercase);
   DCHECK_EQ(lowercase.length(), 32u);  // 32 hex-chars; 0 hyphens.
 
-  base::StringPiece string_piece(lowercase);
+  std::string_view string_piece(lowercase);
 
   uint64_t high = 0;
   bool success = base::HexStringToUInt64(string_piece.substr(0, 16), &high);
@@ -46,7 +46,7 @@
 base::Uuid TokenToGUID(const base::Token& token) {
   const std::string hex_str = base::StringPrintf("%016" PRIx64 "%016" PRIx64,
                                                  token.high(), token.low());
-  const base::StringPiece hex_string_piece(hex_str);
+  const std::string_view hex_string_piece(hex_str);
   const std::string lowercase = base::StrCat(
       {hex_string_piece.substr(0, 8), "-", hex_string_piece.substr(8, 4), "-",
        hex_string_piece.substr(12, 4), "-", hex_string_piece.substr(16, 4), "-",
diff --git a/third_party/blink/renderer/platform/text/text_break_iterator.cc b/third_party/blink/renderer/platform/text/text_break_iterator.cc
index 7937e7d..d54835cc 100644
--- a/third_party/blink/renderer/platform/text/text_break_iterator.cc
+++ b/third_party/blink/renderer/platform/text/text_break_iterator.cc
@@ -299,7 +299,7 @@
 
 enum class FastBreakResult : uint8_t { kNoBreak, kCanBreak, kUnknown };
 
-template <typename CharacterType>
+template <typename CharacterType, bool use_fast_table>
 struct LazyLineBreakIterator::Context {
   STACK_ALLOCATED();
 
@@ -370,8 +370,7 @@
                                                : FastBreakResult::kNoBreak;
     }
 
-    if (UNLIKELY(
-            !RuntimeEnabledFeatures::BreakIteratorDataGeneratorEnabled())) {
+    if constexpr (!use_fast_table) {
       // If both `last_ch` and `ch` are ASCII characters, use a lookup table for
       // enhanced speed and for compatibility with other browsers (see comments
       // for asciiLineBreakTable for details).
@@ -428,7 +427,23 @@
     unsigned pos,
     const CharacterType* str,
     unsigned len) const {
-  Context<CharacterType> context(str, len, start_offset_, pos);
+  if (RuntimeEnabledFeatures::BreakIteratorDataGeneratorEnabled()) {
+    return NextBreakablePosition<CharacterType, line_break_type, break_space,
+                                 /*use_fast_table*/ true>(pos, str, len);
+  }
+  return NextBreakablePosition<CharacterType, line_break_type, break_space,
+                               /*use_fast_table*/ false>(pos, str, len);
+}
+
+template <typename CharacterType,
+          LineBreakType line_break_type,
+          BreakSpaceType break_space,
+          bool use_fast_table>
+inline unsigned LazyLineBreakIterator::NextBreakablePosition(
+    unsigned pos,
+    const CharacterType* str,
+    unsigned len) const {
+  Context<CharacterType, use_fast_table> context(str, len, start_offset_, pos);
   unsigned next_break = 0;
   ULineBreak last_line_break;
   if constexpr (line_break_type == LineBreakType::kBreakAll) {
diff --git a/third_party/blink/renderer/platform/text/text_break_iterator.h b/third_party/blink/renderer/platform/text/text_break_iterator.h
index bff6abf..5d51d9d 100644
--- a/third_party/blink/renderer/platform/text/text_break_iterator.h
+++ b/third_party/blink/renderer/platform/text/text_break_iterator.h
@@ -216,7 +216,7 @@
  private:
   FRIEND_TEST_ALL_PREFIXES(TextBreakIteratorTest, Strictness);
 
-  template <typename CharacterType>
+  template <typename CharacterType, bool use_fast_table>
   struct Context;
 
   const AtomicString& LocaleWithKeyword() const;
@@ -247,6 +247,13 @@
     return iterator_.get();
   }
 
+  template <typename CharacterType,
+            LineBreakType,
+            BreakSpaceType,
+            bool use_fast_table>
+  unsigned NextBreakablePosition(unsigned pos,
+                                 const CharacterType* str,
+                                 unsigned len) const;
   template <typename CharacterType, LineBreakType, BreakSpaceType>
   unsigned NextBreakablePosition(unsigned pos,
                                  const CharacterType* str,
diff --git a/third_party/blink/renderer/platform/weborigin/known_ports.cc b/third_party/blink/renderer/platform/weborigin/known_ports.cc
index 0a13593a..f569772b 100644
--- a/third_party/blink/renderer/platform/weborigin/known_ports.cc
+++ b/third_party/blink/renderer/platform/weborigin/known_ports.cc
@@ -86,7 +86,7 @@
     effective_port = DefaultPortForProtocol(protocol);
   StringUTF8Adaptor utf8(protocol);
   base::AutoLock locker(ExplicitlyAllowedPortsLock());
-  return net::IsPortAllowedForScheme(effective_port, utf8.AsStringPiece());
+  return net::IsPortAllowedForScheme(effective_port, utf8.AsStringView());
 }
 
 void SetExplicitlyAllowedPorts(base::span<const uint16_t> allowed_ports) {
diff --git a/third_party/blink/renderer/platform/weborigin/kurl.cc b/third_party/blink/renderer/platform/weborigin/kurl.cc
index 09f4486..c0376f88 100644
--- a/third_party/blink/renderer/platform/weborigin/kurl.cc
+++ b/third_party/blink/renderer/platform/weborigin/kurl.cc
@@ -200,7 +200,7 @@
 
   StringView path = ComponentStringView(parsed_.path);
   StringUTF8Adaptor path_utf8(path);
-  return GURL::IsAboutPath(path_utf8.AsStringPiece(), allowed_path);
+  return GURL::IsAboutPath(path_utf8.AsStringView(), allowed_path);
 }
 
 bool KURL::IsAboutBlankURL() const {
@@ -780,7 +780,7 @@
 String DecodeURLEscapeSequences(const String& string, DecodeURLMode mode) {
   StringUTF8Adaptor string_utf8(string);
   url::RawCanonOutputT<char16_t> unescaped;
-  url::DecodeURLEscapeSequences(string_utf8.AsStringPiece(), mode, &unescaped);
+  url::DecodeURLEscapeSequences(string_utf8.AsStringView(), mode, &unescaped);
   return StringImpl::Create8BitIfPossible(
       reinterpret_cast<UChar*>(unescaped.data()),
       base::checked_cast<wtf_size_t>(unescaped.length()));
@@ -804,7 +804,7 @@
 
 bool HasInvalidURLEscapeSequences(const String& string) {
   StringUTF8Adaptor string_utf8(string);
-  return url::HasInvalidURLEscapeSequences(string_utf8.AsStringPiece());
+  return url::HasInvalidURLEscapeSequences(string_utf8.AsStringView());
 }
 
 bool KURL::CanSetHostOrPort() const {
diff --git a/third_party/blink/renderer/platform/weborigin/kurl_test.cc b/third_party/blink/renderer/platform/weborigin/kurl_test.cc
index 875cfae3..403bd04c 100644
--- a/third_party/blink/renderer/platform/weborigin/kurl_test.cc
+++ b/third_party/blink/renderer/platform/weborigin/kurl_test.cc
@@ -35,6 +35,8 @@
 
 #include <stdint.h>
 
+#include <string_view>
+
 #include "base/test/scoped_feature_list.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/platform/scheduler/public/non_main_thread.h"
@@ -1258,7 +1260,7 @@
  public:
   using UrlType = blink::KURL;
 
-  static UrlType CreateUrlFromString(base::StringPiece s) {
+  static UrlType CreateUrlFromString(std::string_view s) {
     return blink::KURL(String::FromUTF8(s));
   }
 
diff --git a/third_party/blink/renderer/platform/weborigin/security_origin_test.cc b/third_party/blink/renderer/platform/weborigin/security_origin_test.cc
index 7985a38..a262e284 100644
--- a/third_party/blink/renderer/platform/weborigin/security_origin_test.cc
+++ b/third_party/blink/renderer/platform/weborigin/security_origin_test.cc
@@ -32,6 +32,8 @@
 
 #include <stdint.h>
 
+#include <string_view>
+
 #include "base/test/scoped_command_line.h"
 #include "base/unguessable_token.h"
 #include "net/base/url_util.h"
@@ -1157,7 +1159,7 @@
  public:
   using OriginType = scoped_refptr<blink::SecurityOrigin>;
 
-  static OriginType CreateOriginFromString(base::StringPiece s) {
+  static OriginType CreateOriginFromString(std::string_view s) {
     return blink::SecurityOrigin::CreateFromString(String::FromUTF8(s));
   }
 
@@ -1166,7 +1168,7 @@
   }
 
   static OriginType CreateWithReferenceOrigin(
-      base::StringPiece url,
+      std::string_view url,
       const OriginType& reference_origin) {
     return blink::SecurityOrigin::CreateWithReferenceOrigin(
         blink::KURL(String::FromUTF8(url)), reference_origin.get());
@@ -1206,7 +1208,7 @@
     return origin->ToString().Utf8();
   }
 
-  static bool IsValidUrl(base::StringPiece str) {
+  static bool IsValidUrl(std::string_view str) {
     return blink::KURL(String::FromUTF8(str)).IsValid();
   }
 
@@ -1214,7 +1216,7 @@
     return origin->IsPotentiallyTrustworthy();
   }
 
-  static bool IsUrlPotentiallyTrustworthy(base::StringPiece str) {
+  static bool IsUrlPotentiallyTrustworthy(std::string_view str) {
     // Note: intentionally avoid constructing GURL() directly from `str`, since
     // this is a test harness intended to exercise the behavior of `KURL` and
     // `SecurityOrigin`.
diff --git a/third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h b/third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h
index 63a9e797..38f53d6 100644
--- a/third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h
+++ b/third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h
@@ -31,7 +31,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_STRING_UTF8_ADAPTOR_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_STRING_UTF8_ADAPTOR_H_
 
-#include "base/strings/string_piece.h"
+#include <string_view>
+
 #include "third_party/blink/renderer/platform/wtf/text/string_view.h"
 #include "third_party/blink/renderer/platform/wtf/text/text_encoding.h"
 #include "third_party/blink/renderer/platform/wtf/wtf_export.h"
@@ -52,8 +53,8 @@
   const char* data() const { return data_; }
   wtf_size_t size() const { return size_; }
 
-  base::StringPiece AsStringPiece() const {
-    return base::StringPiece(data_, size_);
+  std::string_view AsStringView() const {
+    return std::string_view(data_, size_);
   }
 
  private:
diff --git a/third_party/blink/renderer/platform/wtf/text/wtf_string.cc b/third_party/blink/renderer/platform/wtf/text/wtf_string.cc
index 0e16f84d..5bbdc54b 100644
--- a/third_party/blink/renderer/platform/wtf/text/wtf_string.cc
+++ b/third_party/blink/renderer/platform/wtf/text/wtf_string.cc
@@ -26,6 +26,7 @@
 #include <stdarg.h>
 
 #include <algorithm>
+#include <string_view>
 
 #include "base/functional/callback.h"
 #include "base/logging.h"
@@ -500,7 +501,7 @@
   return FromUTF8(string, strlen(reinterpret_cast<const char*>(string)));
 }
 
-String String::FromUTF8(base::StringPiece s) {
+String String::FromUTF8(std::string_view s) {
   return FromUTF8(reinterpret_cast<const LChar*>(s.data()), s.size());
 }
 
diff --git a/third_party/blink/renderer/platform/wtf/text/wtf_string.h b/third_party/blink/renderer/platform/wtf/text/wtf_string.h
index 355eecd2..8d186268 100644
--- a/third_party/blink/renderer/platform/wtf/text/wtf_string.h
+++ b/third_party/blink/renderer/platform/wtf/text/wtf_string.h
@@ -27,6 +27,7 @@
 // on systems without case-sensitive file systems.
 
 #include <iosfwd>
+#include <string_view>
 #include <type_traits>
 
 #include "base/containers/span.h"
@@ -522,7 +523,7 @@
   [[nodiscard]] static String FromUTF8(const char* s) {
     return FromUTF8(reinterpret_cast<const LChar*>(s));
   }
-  [[nodiscard]] static String FromUTF8(base::StringPiece);
+  [[nodiscard]] static String FromUTF8(std::string_view);
 
   // Tries to convert the passed in string to UTF-8, but will fall back to
   // Latin-1 if the string is not valid UTF-8.
diff --git a/third_party/blink/renderer/platform/wtf/uuid.cc b/third_party/blink/renderer/platform/wtf/uuid.cc
index 13ca12c..91d4a8c 100644
--- a/third_party/blink/renderer/platform/wtf/uuid.cc
+++ b/third_party/blink/renderer/platform/wtf/uuid.cc
@@ -19,7 +19,7 @@
   // In most (if not all) cases the given uuid should be utf-8, so this
   // conversion should be almost no-op.
   StringUTF8Adaptor utf8(uuid);
-  return base::Uuid::ParseLowercase(utf8.AsStringPiece()).is_valid();
+  return base::Uuid::ParseLowercase(utf8.AsStringView()).is_valid();
 }
 
 }  // namespace WTF
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index ba585c4..2a2b3b4 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1678,13 +1678,6 @@
 crbug.com/40268721 [ Mac ] external/wpt/html/semantics/popovers/light-dismiss-event-ordering.html [ Pass Timeout ]
 crbug.com/332331836 external/wpt/html/semantics/popovers/popover-attribute-basic.html [ Pass Timeout ]
 
-# crbug.com/335223786  Popover with anchor attribute - need html.css rule put back
-crbug.com/335223786 external/wpt/html/semantics/popovers/popover-anchor-display.tentative.html [ Failure ]
-crbug.com/335223786 external/wpt/html/semantics/popovers/popover-anchor-scroll-display.tentative.html [ Failure ]
-crbug.com/335223786 external/wpt/html/semantics/popovers/popover-anchor-change-display.tentative.html [ Failure ]
-crbug.com/335223786 external/wpt/html/semantics/popovers/popover-anchor-transition.tentative.tentative.html [ Failure ]
-crbug.com/335223786 external/wpt/html/semantics/popovers/popover-anchor-display-none.tentative.html [ Failure ]
-
 # Only virtual/threaded version of these tests pass (or running them with --enable-threaded-compositing).
 crbug.com/936891 fast/scrolling/document-level-touchmove-event-listener-passive-by-default.html [ Failure ]
 
@@ -2637,6 +2630,11 @@
 crbug.com/626703 external/wpt/uievents/mouse/mouse_boundary_events_after_removing_last_over_element.html [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/335769262 [ Win11-arm64 ] external/wpt/html/canvas/element/manual/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html [ Failure ]
+crbug.com/335769262 [ Mac14-arm64 ] external/wpt/html/canvas/element/manual/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html [ Failure ]
+crbug.com/335769262 [ Mac13-arm64 ] external/wpt/html/canvas/element/manual/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html [ Failure ]
+crbug.com/335769262 [ Mac12-arm64 ] external/wpt/html/canvas/element/manual/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html [ Failure ]
+crbug.com/335769262 [ Mac11-arm64 ] external/wpt/html/canvas/element/manual/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html [ Failure ]
 crbug.com/335330795 [ Mac14 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/gpu/reduction.https.any.worker.html [ Skip Timeout ]
 crbug.com/335246098 external/wpt/css/css-viewport/zoom/iframe-zoom-nested.html [ Failure ]
 crbug.com/335246098 external/wpt/css/css-viewport/zoom/iframe-zoom.sub.html [ Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 7bbd906..a0bb4aa 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -69552,6 +69552,35 @@
         }
        ]
       ],
+      "mix-blend-mode-parent-element-overflow-hidden-and-border-radius-2.html": [
+       "0b12301c4d91e179a5c5431f8fffde90ee47b1a7",
+       [
+        null,
+        [
+         [
+          "/css/compositing/mix-blend-mode/reference/mix-blend-mode-parent-element-overflow-hidden-and-border-radius-ref.html",
+          "=="
+         ]
+        ],
+        {
+         "fuzzy": [
+          [
+           null,
+           [
+            [
+             0,
+             128
+            ],
+            [
+             0,
+             400
+            ]
+           ]
+          ]
+         ]
+        }
+       ]
+      ],
       "mix-blend-mode-parent-element-overflow-hidden-and-border-radius.html": [
        "840d2626bc1d350a478369dff0626f2b78830099",
        [
@@ -133234,7 +133263,7 @@
        },
        "intrinsic-sizing": {
         "masonry-intrinsic-sizing-001.html": [
-         "2dc9f6de2e52066d322e425967d8898c1ee407a8",
+         "cc0608eafe7f3f983468205a5bdbeda645f2f411",
          [
           null,
           [
@@ -133247,7 +133276,7 @@
          ]
         ],
         "masonry-intrinsic-sizing-002.html": [
-         "b8228cea6e8250587285d0396d4eee6caace352e",
+         "3867bb13c8915dd992cd0081ab54a6dbdfd16d88",
          [
           null,
           [
@@ -133260,7 +133289,7 @@
          ]
         ],
         "masonry-intrinsic-sizing-003.html": [
-         "80bf5d5d23837861cccc8ab9076a1b77550b6df5",
+         "48489d3c86985fedb0635f25c82b129190148edb",
          [
           null,
           [
@@ -133273,7 +133302,7 @@
          ]
         ],
         "masonry-intrinsic-sizing-004.html": [
-         "70a52f37f46a9a438b2e70fa86d55123ebd5121f",
+         "c8bc671bb3b4f5981df78e8e21e0a50bf011fecc",
          [
           null,
           [
@@ -133299,7 +133328,7 @@
          ]
         ],
         "masonry-intrinsic-sizing-006.html": [
-         "fccc116d7d16a38fbe0a5c0e08dadc0b26994d4f",
+         "ad5480092162584589bbea3608f70688d7e6eb3c",
          [
           null,
           [
@@ -231772,7 +231801,7 @@
     },
     "css-view-transitions": {
      "3d-transform-incoming.html": [
-      "983ba1d861a8f58aeac68396eeeec5c7a99a9c63",
+      "4b1411f25dc641ff94878d11a1f4fc30453a1925",
       [
        null,
        [
@@ -231784,11 +231813,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/3d-transform-incoming.html",
-           "/css/css-view-transitions/3d-transform-incoming-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -231805,7 +231830,7 @@
       ]
      ],
      "3d-transform-outgoing.html": [
-      "398fa97ca99bc07e12f31179083c7321099041ee",
+      "2fe4887bb190248d494321bbdb00a3157462963f",
       [
        null,
        [
@@ -231817,11 +231842,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/3d-transform-outgoing.html",
-           "/css/css-view-transitions/3d-transform-outgoing-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -231890,7 +231911,7 @@
       ]
      ],
      "block-with-overflowing-text.html": [
-      "b3f8f42cfdf7ea3eae4833b071eea9b56a6a6e29",
+      "15d1653bfc29ad2233873062454bc157a1d82530",
       [
        null,
        [
@@ -231902,11 +231923,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/block-with-overflowing-text.html",
-           "/css/css-view-transitions/block-with-overflowing-text-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -231923,7 +231940,7 @@
       ]
      ],
      "break-inside-avoid-child.html": [
-      "7b2a83c77691acbae4af3651f637f7d1fa59eb86",
+      "87d56d33af0e187e302eeaf97e81447c5c8fe025",
       [
        null,
        [
@@ -231935,11 +231952,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/break-inside-avoid-child.html",
-           "/css/css-view-transitions/break-inside-avoid-child-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -231969,7 +231982,7 @@
       ]
      ],
      "capture-with-offscreen-child.html": [
-      "8588968d8afba2be185d20422073d43a79a276a1",
+      "7f8085cae2d23b26125db0b49914cb2f9f41a148",
       [
        null,
        [
@@ -231981,11 +231994,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/capture-with-offscreen-child.html",
-           "/css/css-view-transitions/capture-with-offscreen-child-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232002,7 +232011,7 @@
       ]
      ],
      "capture-with-opacity-zero-child.html": [
-      "888d0d17208fb6252df62e5b67a78186541f35e5",
+      "2b0563ea31b6c7e875c7eee4e302836437a72ba8",
       [
        null,
        [
@@ -232014,11 +232023,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/capture-with-opacity-zero-child.html",
-           "/css/css-view-transitions/capture-with-visibility-hidden-child-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232048,7 +232053,7 @@
       ]
      ],
      "capture-with-visibility-mixed-descendants.html": [
-      "462d267b94546313eb1605dccac320ab349871dc",
+      "3a4811ada10ec3d9bf8f2b3df6adec97c9c9ea67",
       [
        null,
        [
@@ -232060,11 +232065,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/capture-with-visibility-mixed-descendants.html",
-           "/css/css-view-transitions/capture-with-visibility-mixed-descendants-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232094,7 +232095,7 @@
       ]
      ],
      "clip-path-larger-than-border-box-on-child-of-named-element.html": [
-      "4cde9cb586bb8b9a575a110758bb420e59842069",
+      "4a26c50ef82e0d2dad55f56ae602755cea65dfe5",
       [
        null,
        [
@@ -232106,11 +232107,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html",
-           "/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232205,7 +232202,7 @@
       ]
      ],
      "content-with-transform-new-image.html": [
-      "f86f64843c8022d95f0973e73cc73943112f8034",
+      "a6c444917a46ddc39d864eb4be87e07f2160d007",
       [
        null,
        [
@@ -232217,11 +232214,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/content-with-transform-new-image.html",
-           "/css/css-view-transitions/content-with-transform-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232238,7 +232231,7 @@
       ]
      ],
      "content-with-transform-old-image.html": [
-      "3755910a1b6b18480250094267f9fa4500c4c9d5",
+      "c6fda7f98852a7395316a1d20c1c3e54b3aeda5d",
       [
        null,
        [
@@ -232250,11 +232243,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/content-with-transform-old-image.html",
-           "/css/css-view-transitions/content-with-transform-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232285,7 +232274,7 @@
       ]
      ],
      "css-tags-paint-order-with-entry.html": [
-      "2ba73758e2379102159403a8f6f25371e4d218e5",
+      "c8d92ed33f8f8e11e7eead7fd5ddd66add1131e8",
       [
        null,
        [
@@ -232297,11 +232286,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/css-tags-paint-order-with-entry.html",
-           "/css/css-view-transitions/css-tags-paint-order-with-entry-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232344,7 +232329,7 @@
       ]
      ],
      "dialog-in-rtl-iframe.html": [
-      "f5959bf434db9c84c21d7a72917ccb40c018003b",
+      "05bc98dca97dab1bb3e12f4cad3c032572c163ec",
       [
        null,
        [
@@ -232356,11 +232341,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/dialog-in-rtl-iframe.html",
-           "/css/css-view-transitions/dialog-in-rtl-iframe-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232455,7 +232436,7 @@
       ]
      ],
      "far-away-capture.html": [
-      "97ad9dfb44b0e37c96ff53bf36007f8c060c2396",
+      "9ac162163956093d90609ef3060b2d13dd4893f2",
       [
        null,
        [
@@ -232467,11 +232448,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/far-away-capture.html",
-           "/css/css-view-transitions/far-away-capture-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232514,7 +232491,7 @@
       ]
      ],
      "fractional-box-with-overflow-children-new.html": [
-      "e50e6654a75578559cfb55ee972cb619a954a579",
+      "14371aca3fc040d790e31efea1bb150178d59c2c",
       [
        null,
        [
@@ -232526,11 +232503,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/fractional-box-with-overflow-children-new.html",
-           "/css/css-view-transitions/fractional-box-with-overflow-children-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232547,7 +232520,7 @@
       ]
      ],
      "fractional-box-with-overflow-children-old.html": [
-      "acf72e20df5c6e0dcee12f06e4088b31934753b0",
+      "0d19bf9c296b32fa2b667b70337f24b6187ba6fa",
       [
        null,
        [
@@ -232559,11 +232532,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/fractional-box-with-overflow-children-old.html",
-           "/css/css-view-transitions/fractional-box-with-overflow-children-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232700,7 +232669,7 @@
       ]
      ],
      "iframe-new-has-scrollbar.html": [
-      "67a57bb8852a487e273e59772ab61c710a51efc2",
+      "81072ac38aa1d8fd98649b23ffe178c633daedb7",
       [
        null,
        [
@@ -232712,11 +232681,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/iframe-new-has-scrollbar.html",
-           "/css/css-view-transitions/iframe-new-has-scrollbar-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232733,7 +232698,7 @@
       ]
      ],
      "iframe-old-has-scrollbar.html": [
-      "96dd75a3dfa7de6c02815ab813d01a00bdb92bad",
+      "5d266333989b36260f0de9a6350d7a8d3d4d0dca",
       [
        null,
        [
@@ -232745,11 +232710,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/iframe-old-has-scrollbar.html",
-           "/css/css-view-transitions/iframe-old-has-scrollbar-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232766,7 +232727,7 @@
       ]
      ],
      "iframe-transition.sub.html": [
-      "8fa361b0fc38843409dd7f754edf1ec238e3ec42",
+      "5f26a494b24c7c16781f11d5239fa1d2cc0fa3e7",
       [
        null,
        [
@@ -232778,11 +232739,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/iframe-transition.sub.html",
-           "/css/css-view-transitions/iframe-transition-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232826,7 +232783,7 @@
       ]
      ],
      "inline-with-offset-from-containing-block.html": [
-      "8640899814a08ac38a1ea1e69fc63c7e39c9c231",
+      "026ecb240a35f1ca1c7044f95f4d09468af9e05f",
       [
        null,
        [
@@ -232838,11 +232795,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/inline-with-offset-from-containing-block.html",
-           "/css/css-view-transitions/inline-with-offset-from-containing-block-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232872,7 +232825,7 @@
       ]
      ],
      "massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html": [
-      "23f5fc22cf405d230c184cbd4d47131dec84fd4b",
+      "65b14a6c4b85f90ba382dbb93e3fd591c8be85f7",
       [
        null,
        [
@@ -232884,11 +232837,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html",
-           "/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232934,7 +232883,7 @@
       ]
      ],
      "massive-element-below-viewport-offscreen-new.html": [
-      "611d4da21a64d0fcc356824e4e98599c102e5225",
+      "a122cd4b3bcc003105ae47124c5b8b5ed003b638",
       [
        null,
        [
@@ -232946,11 +232895,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-below-viewport-offscreen-new.html",
-           "/css/css-view-transitions/massive-element-below-viewport-offscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -232967,7 +232912,7 @@
       ]
      ],
      "massive-element-below-viewport-offscreen-old.html": [
-      "bda3ebf1b1b86da98d14ddeb19365f52026f74c1",
+      "567819fadff7b6e846229a8fecb48ffc7e8b198d",
       [
        null,
        [
@@ -232979,11 +232924,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-below-viewport-offscreen-old.html",
-           "/css/css-view-transitions/massive-element-below-viewport-offscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233000,7 +232941,7 @@
       ]
      ],
      "massive-element-below-viewport-partially-onscreen-new.html": [
-      "e881e19622790ee313073a413b7d8f3cb2152b77",
+      "42f97555f5c7bbc5ec322b6fa733bac97d41b7e4",
       [
        null,
        [
@@ -233012,11 +232953,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html",
-           "/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233062,7 +232999,7 @@
       ]
      ],
      "massive-element-left-of-viewport-offscreen-new.html": [
-      "c8471032a4865cd14d6930febfc353159558e787",
+      "97a3cb41ff1d2e4f503021e7edc3f03c30be969c",
       [
        null,
        [
@@ -233074,11 +233011,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-left-of-viewport-offscreen-new.html",
-           "/css/css-view-transitions/massive-element-left-of-viewport-offscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233095,7 +233028,7 @@
       ]
      ],
      "massive-element-left-of-viewport-offscreen-old.html": [
-      "04ab58f3aa162c2ff5f3173f0ea4cb5e99a2e060",
+      "a41a73882660a0aea3fd3402113ca1bb5251a2d5",
       [
        null,
        [
@@ -233107,11 +233040,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-left-of-viewport-offscreen-old.html",
-           "/css/css-view-transitions/massive-element-left-of-viewport-offscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233128,7 +233057,7 @@
       ]
      ],
      "massive-element-left-of-viewport-partially-onscreen-new.html": [
-      "15cc94ffe714e0fdf09b708c21c773e299e98b15",
+      "accd909158e0e5d199097efad16fe6fff07aa067",
       [
        null,
        [
@@ -233140,11 +233069,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-new.html",
-           "/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233161,7 +233086,7 @@
       ]
      ],
      "massive-element-left-of-viewport-partially-onscreen-old.html": [
-      "0d2aeec59dbf8111403b50c493abc7009222e572",
+      "e16806e8f37c7327a31e1193df7c86508f4464a9",
       [
        null,
        [
@@ -233173,11 +233098,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-old.html",
-           "/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233194,7 +233115,7 @@
       ]
      ],
      "massive-element-on-top-of-viewport-offscreen-new.html": [
-      "6ef8edd3b00de31e94636e54669ea68349317fcd",
+      "24edbc1ec7a0ba52b91d36a42e74ba2d0685f004",
       [
        null,
        [
@@ -233206,11 +233127,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-new.html",
-           "/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233227,7 +233144,7 @@
       ]
      ],
      "massive-element-on-top-of-viewport-offscreen-old.html": [
-      "5e303e8286aca8db216f621ada061853631554b4",
+      "8dfc8eefe1458e4c669302179f0da0e68dbf136e",
       [
        null,
        [
@@ -233239,11 +233156,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-old.html",
-           "/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233260,7 +233173,7 @@
       ]
      ],
      "massive-element-on-top-of-viewport-partially-onscreen-new.html": [
-      "a9e5f5842afe3e68f0dee7a0c8e051aa3324a31d",
+      "c301e470996b5804839a4b6c4ce633501df43e45",
       [
        null,
        [
@@ -233272,11 +233185,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-new.html",
-           "/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233293,7 +233202,7 @@
       ]
      ],
      "massive-element-on-top-of-viewport-partially-onscreen-old.html": [
-      "41dc622914b2ce23351517b434c6926c238c6ed6",
+      "1f810af745b1455001a6c433903f0a435f52d43e",
       [
        null,
        [
@@ -233305,11 +233214,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-old.html",
-           "/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233326,7 +233231,7 @@
       ]
      ],
      "massive-element-right-and-left-of-viewport-partially-onscreen-new.html": [
-      "719701fe888da0cb15cccc233003e645117adccb",
+      "426751d09397f101cbd981bdfbc4c32731c1ae64",
       [
        null,
        [
@@ -233338,11 +233243,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-new.html",
-           "/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233388,7 +233289,7 @@
       ]
      ],
      "massive-element-right-of-viewport-offscreen-new.html": [
-      "89d00a53a86030782e7c23b7dc4ca7a4f1a42d21",
+      "53749f29b2f9147cd1fbeb4d82fcdc8ecdb55bb0",
       [
        null,
        [
@@ -233400,11 +233301,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-right-of-viewport-offscreen-new.html",
-           "/css/css-view-transitions/massive-element-right-of-viewport-offscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233421,7 +233318,7 @@
       ]
      ],
      "massive-element-right-of-viewport-offscreen-old.html": [
-      "04247af18e51a827ed131bf5cccfb99037c9652f",
+      "b5337c4491428a828f935782d669554ef011c89f",
       [
        null,
        [
@@ -233433,11 +233330,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-right-of-viewport-offscreen-old.html",
-           "/css/css-view-transitions/massive-element-right-of-viewport-offscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233454,7 +233347,7 @@
       ]
      ],
      "massive-element-right-of-viewport-partially-onscreen-new.html": [
-      "a7b599e5eba8cc3e17a031172fd32803d4412799",
+      "ac3fe48a0a7835a9085a8dfc3daf9d2dee674673",
       [
        null,
        [
@@ -233466,11 +233359,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-new.html",
-           "/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233487,7 +233376,7 @@
       ]
      ],
      "massive-element-right-of-viewport-partially-onscreen-old.html": [
-      "2498f2e1f17990843508541fea0febad946a8c4f",
+      "2626910d7836da42c21cd33b24a2b4f04f9e8a65",
       [
        null,
        [
@@ -233499,11 +233388,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-old.html",
-           "/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233533,7 +233418,7 @@
       ]
      ],
      "multiline-span-with-overflowing-text-and-box-decorations.html": [
-      "e166b3c9dfe66370a4800ff6cac37e236100d62d",
+      "8fff184b2a71112466590a356e516000beeacd40",
       [
        null,
        [
@@ -233545,11 +233430,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/multiline-span-with-overflowing-text-and-box-decorations.html",
-           "/css/css-view-transitions/multiline-span-with-overflowing-text-and-box-decorations-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233592,7 +233473,7 @@
       ]
      ],
      "new-and-old-sizes-match.html": [
-      "094d6963bfbd509d34c1be635147dfb0baf37cdf",
+      "70b6515fb5b8189c925127636f7860ae424f0284",
       [
        null,
        [
@@ -233604,11 +233485,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/new-and-old-sizes-match.html",
-           "/css/css-view-transitions/new-and-old-sizes-match-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233625,7 +233502,7 @@
       ]
      ],
      "new-content-captures-clip-path.html": [
-      "702bb09bc336db351eba8082657c97f028afee8c",
+      "19af2493d05ed1e0d4fd82a01dcb8f5dc304a731",
       [
        null,
        [
@@ -233637,11 +233514,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/new-content-captures-clip-path.html",
-           "/css/css-view-transitions/new-content-captures-clip-path-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233658,7 +233531,7 @@
       ]
      ],
      "new-content-captures-different-size.html": [
-      "740199675dd67f1ae11a1e75c85022146632ce43",
+      "18f323c32075bc9f10d6f007ab18eb2caad3812f",
       [
        null,
        [
@@ -233670,11 +233543,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/new-content-captures-different-size.html",
-           "/css/css-view-transitions/new-content-captures-different-size-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233829,7 +233698,7 @@
       ]
      ],
      "new-content-has-scrollbars.html": [
-      "3246a7e76f34c8f3fbdd06fdceaace6920ad59b7",
+      "834d0e8f454ebd7f87f5cde66d19d475563d4a3e",
       [
        null,
        [
@@ -233841,11 +233710,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/new-content-has-scrollbars.html",
-           "/css/css-view-transitions/new-content-has-scrollbars-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233889,7 +233754,7 @@
       ]
      ],
      "new-content-is-inline.html": [
-      "46c96acb0471eace651554d4796673b2e06dd7e6",
+      "81b261a9bfffaf1ef4be4ac94f90673475450c15",
       [
        null,
        [
@@ -233901,11 +233766,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/new-content-is-inline.html",
-           "/css/css-view-transitions/new-content-is-inline-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -233922,7 +233783,7 @@
       ]
      ],
      "new-content-object-fit-fill.html": [
-      "04a80409c5eb79bf269ed4aa94582186aca4a493",
+      "a610d688023439155382f48f2b9fb6b4b81d030a",
       [
        null,
        [
@@ -233934,11 +233795,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/new-content-object-fit-fill.html",
-           "/css/css-view-transitions/content-object-fit-fill-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234020,7 +233877,7 @@
       ]
      ],
      "new-content-scaling.html": [
-      "bccb760fb59560599572722220bf718dfffaf5d7",
+      "376b7fd11f7e2e86e549c300fcb09cc8767751c4",
       [
        null,
        [
@@ -234032,11 +233889,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/new-content-scaling.html",
-           "/css/css-view-transitions/new-content-scaling-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234172,7 +234025,7 @@
       ]
      ],
      "object-view-box-old-image.html": [
-      "335e48fa70ea79f992f249068cd157664b4d5b77",
+      "793dfd46c9f4e336829ed60a0a755a573849f443",
       [
        null,
        [
@@ -234184,11 +234037,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/object-view-box-old-image.html",
-           "/css/css-view-transitions/object-view-box-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234219,7 +234068,7 @@
       ]
      ],
      "old-content-captures-clip-path.html": [
-      "7ed5e1ca15defb597f73472dab08efcc90542f8a",
+      "67aa5bf32f6b83219dba4dc0152dcbc30c002c37",
       [
        null,
        [
@@ -234231,11 +234080,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/old-content-captures-clip-path.html",
-           "/css/css-view-transitions/old-content-captures-clip-path-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234252,7 +234097,7 @@
       ]
      ],
      "old-content-captures-different-size.html": [
-      "392247bc9518886890246f1c293f840db4501b53",
+      "7f3be742b0d400d17e3aba73360a9c9dd6de6c02",
       [
        null,
        [
@@ -234264,11 +234109,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/old-content-captures-different-size.html",
-           "/css/css-view-transitions/old-content-captures-different-size-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234286,7 +234127,7 @@
       ]
      ],
      "old-content-captures-opacity.html": [
-      "cd71c9dfaf10d313d9e3ec84b56ad998c3e3042c",
+      "97b89116445f6c3588e225910c2e859e69832498",
       [
        null,
        [
@@ -234298,11 +234139,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/old-content-captures-opacity.html",
-           "/css/css-view-transitions/old-content-captures-opacity-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234319,7 +234156,7 @@
       ]
      ],
      "old-content-captures-root.html": [
-      "51a22bc13608c16430a1acd846c896fd94d60828",
+      "a1cb3329426aa7ab00946b92833b4440fd38f84c",
       [
        null,
        [
@@ -234331,11 +234168,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/old-content-captures-root.html",
-           "/css/css-view-transitions/old-content-captures-root-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234378,7 +234211,7 @@
       ]
      ],
      "old-content-has-scrollbars.html": [
-      "13e26c702d54d0397ef8517b252502de5972a74c",
+      "b9638ebb10082ee73b47a5a98244f327731b0d6c",
       [
        null,
        [
@@ -234390,11 +234223,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/old-content-has-scrollbars.html",
-           "/css/css-view-transitions/old-content-has-scrollbars-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234438,7 +234267,7 @@
       ]
      ],
      "old-content-is-inline.html": [
-      "70ff67c0e0ab78f891acf370ab19bf0e336f8dc7",
+      "3333a07a02963e45f3e8991ea102533226e0dc41",
       [
        null,
        [
@@ -234450,11 +234279,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/old-content-is-inline.html",
-           "/css/css-view-transitions/old-content-is-inline-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234471,7 +234296,7 @@
       ]
      ],
      "old-content-object-fit-fill.html": [
-      "0652b30a070c4f5acaead54ad799f420e582f264",
+      "51023fa27b6b1a47c03524037e5e32ad8d742a3e",
       [
        null,
        [
@@ -234483,11 +234308,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/old-content-object-fit-fill.html",
-           "/css/css-view-transitions/content-object-fit-fill-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234517,7 +234338,7 @@
       ]
      ],
      "old-content-object-view-box-clip-path-reference.html": [
-      "5e6969d9cca716907cdfe89adcdc60a2b8126402",
+      "827ca027dd5157f236b084e00595575a18ed488c",
       [
        null,
        [
@@ -234529,11 +234350,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/old-content-object-view-box-clip-path-reference.html",
-           "/css/css-view-transitions/old-content-object-view-box-clip-path-reference-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234550,7 +234367,7 @@
       ]
      ],
      "old-content-object-view-box-clip-path.html": [
-      "f8945551542e100da2b4fe85bcae3086684fbf63",
+      "d0d26b9790117bfdaded30cf9f19bb531dd51b42",
       [
        null,
        [
@@ -234562,11 +234379,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/old-content-object-view-box-clip-path.html",
-           "/css/css-view-transitions/old-content-object-view-box-clip-path-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234663,7 +234476,7 @@
       ]
      ],
      "pseudo-rendering-invalidation.html": [
-      "e1f17186183dd64c8adc32086ee9a9a655c60cb5",
+      "4d492c40d8761ddda3551448ce725cfbb5a82f4a",
       [
        null,
        [
@@ -234675,11 +234488,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/pseudo-rendering-invalidation.html",
-           "/css/css-view-transitions/pseudo-rendering-invalidation-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -234891,7 +234700,7 @@
       ]
      ],
      "root-captured-as-different-tag.html": [
-      "a4d6f11ad4977f7b6cf4e0c584e65d784d76be53",
+      "1d4d1610d16bd4e6e682acdc19fcad3d48aefa2f",
       [
        null,
        [
@@ -234903,11 +234712,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/root-captured-as-different-tag.html",
-           "/css/css-view-transitions/old-content-captures-root-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235047,7 +234852,7 @@
       ]
      ],
      "scroller-child-abspos.html": [
-      "3b94ffa7bb99b88ee1f8a052e19feab147e577f4",
+      "d04f87215edfd41131a1d02b84dc4f999f8c7138",
       [
        null,
        [
@@ -235059,11 +234864,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/scroller-child-abspos.html",
-           "/css/css-view-transitions/scroller-child-abspos-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235080,7 +234881,7 @@
       ]
      ],
      "scroller-child.html": [
-      "5cb2f03e704334dad70745a9221a035bd169502a",
+      "7d4368fe574d0509bf3a11e21815eb7de4bb55a8",
       [
        null,
        [
@@ -235092,11 +234893,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/scroller-child.html",
-           "/css/css-view-transitions/scroller-child-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235113,7 +234910,7 @@
       ]
      ],
      "scroller.html": [
-      "e61d13b3166e7ebab7fb18f6180f9b6efab027b8",
+      "9d820468918d5f4c2c2d91cb622392e39182a055",
       [
        null,
        [
@@ -235125,11 +234922,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/scroller.html",
-           "/css/css-view-transitions/scroller-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235159,7 +234952,7 @@
       ]
      ],
      "set-current-time.html": [
-      "f7e802d79b4f1a6ede216cc8cb8a9879b67f2a70",
+      "efe561c6ea549686dfc88ad40e9cac7aa9a9b420",
       [
        null,
        [
@@ -235171,11 +234964,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/set-current-time.html",
-           "/css/css-view-transitions/set-current-time-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235205,7 +234994,7 @@
       ]
      ],
      "snapshot-containing-block-absolute.html": [
-      "4a619f29cc29978828c80bf371da0f53f95b7746",
+      "91b71f7eec99096a7f9ce7615f418634728cee5f",
       [
        null,
        [
@@ -235217,11 +235006,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/snapshot-containing-block-absolute.html",
-           "/css/css-view-transitions/snapshot-containing-block-absolute-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235238,7 +235023,7 @@
       ]
      ],
      "snapshot-containing-block-includes-scrollbar-gutter.html": [
-      "8e47a056bdc039f6c47d2da041d3edde497a1aa1",
+      "40feea46ef78a5d431739b581e0fdc5f8761989d",
       [
        null,
        [
@@ -235250,11 +235035,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/snapshot-containing-block-includes-scrollbar-gutter.html",
-           "/css/css-view-transitions/snapshot-containing-block-includes-scrollbar-gutter-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235271,7 +235052,7 @@
       ]
      ],
      "snapshot-containing-block-static.html": [
-      "fc0c7033c9bc278f08433fb429b204421fb7f9d0",
+      "44fe4cfc5e66e8afff7ad1a21db40d8d1576be37",
       [
        null,
        [
@@ -235283,11 +235064,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/snapshot-containing-block-static.html",
-           "/css/css-view-transitions/snapshot-containing-block-static-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235304,7 +235081,7 @@
       ]
      ],
      "span-with-overflowing-text-and-box-decorations.html": [
-      "a2bf59ecb00771c3bcb68eefd6622ad86df18073",
+      "262970ad5fba81e630e31a39d1742d09fb98a9e8",
       [
        null,
        [
@@ -235316,11 +235093,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html",
-           "/css/css-view-transitions/span-with-overflowing-text-and-box-decorations-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235350,7 +235123,7 @@
       ]
      ],
      "span-with-overflowing-text.html": [
-      "f3f0f534e9e10c57d42ada86aa08d60df044f080",
+      "5a6268ddf03c43bcdf1dbbda161c35c19365ef3e",
       [
        null,
        [
@@ -235362,11 +235135,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/span-with-overflowing-text.html",
-           "/css/css-view-transitions/span-with-overflowing-text-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235396,7 +235165,7 @@
       ]
      ],
      "transition-in-empty-iframe.html": [
-      "7cd621fbfdc4f8951f38cb1b0bc6735b5303305e",
+      "101f7c2a632f6b02ed285a0a73c46a3934b54667",
       [
        null,
        [
@@ -235408,11 +235177,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/transition-in-empty-iframe.html",
-           "/css/css-view-transitions/transition-in-empty-iframe-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235481,7 +235246,7 @@
       ]
      ],
      "web-animations-api-parse-pseudo-argument.html": [
-      "40c9a0d0c2ec81624a06523c7b000d1a902507c0",
+      "dfaac62c17f99e7465a32c452eaed807f289cac6",
       [
        "css/css-view-transitions/web-animations-api-parse-pseudo-argument.html?first-pseudo=::view-transition-group(      first )",
        [
@@ -235493,11 +235258,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
-           "/css/css-view-transitions/web-animations-api-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235523,11 +235284,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
-           "/css/css-view-transitions/web-animations-api-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235553,11 +235310,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
-           "/css/css-view-transitions/web-animations-api-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235583,11 +235336,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
-           "/css/css-view-transitions/web-animations-api-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235613,11 +235362,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
-           "/css/css-view-transitions/web-animations-api-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235643,11 +235388,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
-           "/css/css-view-transitions/web-animations-api-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -235664,7 +235405,7 @@
       ]
      ],
      "web-animations-api.html": [
-      "c739e416c8c900774cb14ff77b62d27f1ba8c6a6",
+      "23b1504b240a92e6f2f7a99b6684a621c2631866",
       [
        null,
        [
@@ -235676,11 +235417,7 @@
        {
         "fuzzy": [
          [
-          [
-           "/css/css-view-transitions/web-animations-api.html",
-           "/css/css-view-transitions/web-animations-api-ref.html",
-           "=="
-          ],
+          null,
           [
            [
             0,
@@ -320129,32 +319866,32 @@
        },
        "intrinsic-sizing": {
         "masonry-intrinsic-sizing-001-ref.html": [
-         "bd1cddd9db0f22ea504a82ebec5e18c19b15c374",
+         "1a9f65aaf698b0b20b2c33b17420795972d6ff8d",
          []
         ],
         "masonry-intrinsic-sizing-002-ref.html": [
-         "37f65bace8c50dad1e82bd969d694299dfa20750",
+         "ddae8e7fe37f8873791cd56d8c6404eafa6fd703",
          []
         ],
         "masonry-intrinsic-sizing-003-ref.html": [
-         "886c147a90bef3c1cc64b6c1e5633de15b6f06ce",
+         "044750dc45183a50fb19153977081eb0e7b83eaa",
          []
         ],
         "masonry-intrinsic-sizing-004-ref.html": [
-         "166a467d4e83eecf31f8496b8f2c88ef96d7b606",
+         "302dcad11696895a9f3fb12ac5a38d0d721b2650",
          []
         ],
         "masonry-intrinsic-sizing-005-ref.html": [
-         "48225803963ec31c77ca85ea1b1dd5a06cba354c",
+         "725f646ebd9160f91dcba65fdbdbb77e0c20e370",
          []
         ],
         "masonry-intrinsic-sizing-006-ref.html": [
-         "a616fadb772eee5cf0fd051378e3aabf7e62e628",
+         "1a88c2b4cb665dd4586f662d280475dab3cd0ae6",
          []
         ],
         "support": {
          "masonry-intrinsic-sizing-visual.css": [
-          "dbb6303ab18654eb736830c323cdc7c41e5f81a6",
+          "150f0f2679a35a97fc0fb7de792c4473850b73d9",
           []
          ]
         }
@@ -344517,7 +344254,7 @@
        []
       ],
       "hueRotate.svg": [
-       "ed294041e156d0087cd551aa593846bb3ec136fa",
+       "0ddcb37d70dd68257078d10950f4e4f8680be267",
        []
       ],
       "import-green.css": [
@@ -379220,22 +378957,10 @@
      "d59e5e30845eaef12bab6419e348a01779313c56",
      []
     ],
-    "MediaRecorder-canvas-media-source.https_mimeType=video_mp4;codecs=avc1,mp4a.40.2-expected.txt": [
-     "384a1534a341fa7898d3196133eabd61b75d3f10",
-     []
-    ],
-    "MediaRecorder-events-and-exceptions_mimeType=video_mp4;codecs=avc1,mp4a.40.2-expected.txt": [
-     "aff8100f2ba4b080e86f25a0fd692becf821a3ac",
-     []
-    ],
     "MediaRecorder-peerconnection-no-sink.https-expected.txt": [
      "b8820487fa2473679df487868372de00781624e4",
      []
     ],
-    "MediaRecorder-stop_mimeType=video_mp4;codecs=avc1,mp4a.40.2-expected.txt": [
-     "02f0a65b6e62e9233431c03b87f4ca105648d541",
-     []
-    ],
     "OWNERS": [
      "5c49de21a3b53dfe928d30a36400469d8238bb1d",
      []
@@ -388407,7 +388132,7 @@
     "focus-navigation": {
      "resources": {
       "focus-utils.js": [
-       "f593267cc31f8d9060b48f95fd91c5629d5b29ee",
+       "0392cfb88792ee66d93eb7f1430fa6afd846c858",
        []
       ],
       "shadow-dom.js": [
@@ -438655,83 +438380,6 @@
      ]
     ],
     "fedcm-multi-idp": {
-     "abort-multiple-gets-through-first-idp.https.html": [
-      "ed7c1300bd1b95cd3f7d233e7a0ee638829f2990",
-      [
-       null,
-       {}
-      ]
-     ],
-     "abort-multiple-gets-through-second-idp.https.html": [
-      "dfe8969932b8a88ba9f52284c99a0fb1e4628a71",
-      [
-       null,
-       {}
-      ]
-     ],
-     "get-before-and-after-onload.https.html": [
-      "12e0eb4d813eed1cd358ad072ed1c48ed7e78f36",
-      [
-       null,
-       {
-        "testdriver": true
-       }
-      ]
-     ],
-     "get-before-and-during-onload.https.html": [
-      "3e2f134f201aa2d1f6a4461cd4b15f737b8d065b",
-      [
-       null,
-       {
-        "testdriver": true
-       }
-      ]
-     ],
-     "get-before-onload-and-during-dom-content-loaded.https.html": [
-      "95495948b77379e0650db2216d6f4b5c2b19915e",
-      [
-       null,
-       {
-        "testdriver": true
-       }
-      ]
-     ],
-     "multiple-gets-after-abort.https.html": [
-      "899302fb221e94a8df562616fd559a2325f8a15d",
-      [
-       null,
-       {
-        "testdriver": true
-       }
-      ]
-     ],
-     "multiple-gets-after-onload.https.html": [
-      "1b5d744e8f60fffdc44d720d7b0a6233f181b531",
-      [
-       null,
-       {
-        "testdriver": true
-       }
-      ]
-     ],
-     "multiple-gets-before-onload.https.html": [
-      "8c98bf53b0c579a860d05c6229dcd1bbc0429e16",
-      [
-       null,
-       {
-        "testdriver": true
-       }
-      ]
-     ],
-     "multiple-gets-during-onload.https.html": [
-      "bcf70a31c74deacb9a661d03db5a951777b31b08",
-      [
-       null,
-       {
-        "testdriver": true
-       }
-      ]
-     ],
      "single-get-after-onload.https.html": [
       "de6a7c5371cc839a41c89318e5f8b0ad00b107e0",
       [
@@ -600075,7 +599723,7 @@
      ]
     ],
     "MediaRecorder-canvas-media-source.https.html": [
-     "e640714d5cf38d1250c7b07a476a360aee0e81b8",
+     "0680c218795b1e217376177bea6f14b0e1a11a40",
      [
       "mediacapture-record/MediaRecorder-canvas-media-source.https.html?mimeType=''",
       {
@@ -600084,6 +599732,13 @@
       }
      ],
      [
+      "mediacapture-record/MediaRecorder-canvas-media-source.https.html?mimeType=video/mp4",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
       "mediacapture-record/MediaRecorder-canvas-media-source.https.html?mimeType=video/mp4;codecs=avc1,mp4a.40.2",
       {
        "testdriver": true,
@@ -600091,6 +599746,13 @@
       }
      ],
      [
+      "mediacapture-record/MediaRecorder-canvas-media-source.https.html?mimeType=video/mp4;codecs=vp9,opus",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
       "mediacapture-record/MediaRecorder-canvas-media-source.https.html?mimeType=video/webm;codecs=av1,opus",
       {
        "testdriver": true,
@@ -600152,7 +599814,7 @@
      ]
     ],
     "MediaRecorder-events-and-exceptions.html": [
-     "409e46c91da21805e238c4237be481385a25e79f",
+     "97ada2126634e550c8df7bd15807db0befa99a3f",
      [
       "mediacapture-record/MediaRecorder-events-and-exceptions.html?mimeType=''",
       {
@@ -600160,12 +599822,24 @@
       }
      ],
      [
+      "mediacapture-record/MediaRecorder-events-and-exceptions.html?mimeType=video/mp4",
+      {
+       "timeout": "long"
+      }
+     ],
+     [
       "mediacapture-record/MediaRecorder-events-and-exceptions.html?mimeType=video/mp4;codecs=avc1,mp4a.40.2",
       {
        "timeout": "long"
       }
      ],
      [
+      "mediacapture-record/MediaRecorder-events-and-exceptions.html?mimeType=video/mp4;codecs=vp9,opus",
+      {
+       "timeout": "long"
+      }
+     ],
+     [
       "mediacapture-record/MediaRecorder-events-and-exceptions.html?mimeType=video/webm;codecs=av1,opus",
       {
        "timeout": "long"
@@ -600185,14 +599859,14 @@
      ]
     ],
     "MediaRecorder-mimetype.html": [
-     "74248d65f4660a25742d7baa5d050e40ed4199bd",
+     "57baa1346f172ec766256969b17f8e44197d856f",
      [
       null,
       {}
      ]
     ],
     "MediaRecorder-pause-resume.html": [
-     "8dc231279a0233b19ef6b87b4318d1a98e23fb69",
+     "f584508a0d0d42d60ae332a42b3fe776bd3247a6",
      [
       "mediacapture-record/MediaRecorder-pause-resume.html?mimeType=''",
       {
@@ -600200,12 +599874,36 @@
       }
      ],
      [
+      "mediacapture-record/MediaRecorder-pause-resume.html?mimeType=video/mp4",
+      {
+       "timeout": "long"
+      }
+     ],
+     [
       "mediacapture-record/MediaRecorder-pause-resume.html?mimeType=video/mp4;codecs=avc1,mp4a.40.2",
       {
        "timeout": "long"
       }
      ],
      [
+      "mediacapture-record/MediaRecorder-pause-resume.html?mimeType=video/mp4;codecs=avc1,opus",
+      {
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-pause-resume.html?mimeType=video/mp4;codecs=vp9,mp4a.40.2",
+      {
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-pause-resume.html?mimeType=video/mp4;codecs=vp9,opus",
+      {
+       "timeout": "long"
+      }
+     ],
+     [
       "mediacapture-record/MediaRecorder-pause-resume.html?mimeType=video/webm;codecs=av1,opus",
       {
        "timeout": "long"
@@ -600235,9 +599933,93 @@
      ]
     ],
     "MediaRecorder-peerconnection.https.html": [
-     "3fbc1f0f2d292e4fd5cd41d751c0994fb7d658ed",
+     "daae044fa8d9d7d1f0fe40026ac9a42e96e129b9",
      [
-      null,
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=audio&mimeType=''",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=audio&mimeType=audio/mp4;codecs=opus",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=audio&mimeType=audio/webm;codecs=opus",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=video&mimeType=''",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=video&mimeType=video/mp4;codecs=vp9",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=video&mimeType=video/webm;codecs=vp8",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=video&mimeType=video/webm;codecs=vp9",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=video,audio&mimeType=''",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=video,audio&mimeType=video/mp4",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=video,audio&mimeType=video/mp4;codecs=avc1,mp4a.40.2",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=video,audio&mimeType=video/mp4;codecs=vp9,opus",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=video,audio&mimeType=video/webm;codecs=vp8,opus",
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ],
+     [
+      "mediacapture-record/MediaRecorder-peerconnection.https.html?kinds=video,audio&mimeType=video/webm;codecs=vp9,opus",
       {
        "testdriver": true,
        "timeout": "long"
@@ -600252,16 +600034,24 @@
      ]
     ],
     "MediaRecorder-stop.html": [
-     "d6ce3707720a066b06fef71016e3e2b0366d3658",
+     "9ef5051638130f92f62753fb3aedf857bc8cbeba",
      [
       "mediacapture-record/MediaRecorder-stop.html?mimeType=''",
       {}
      ],
      [
+      "mediacapture-record/MediaRecorder-stop.html?mimeType=video/mp4",
+      {}
+     ],
+     [
       "mediacapture-record/MediaRecorder-stop.html?mimeType=video/mp4;codecs=avc1,mp4a.40.2",
       {}
      ],
      [
+      "mediacapture-record/MediaRecorder-stop.html?mimeType=video/mp4;codecs=vp9,opus",
+      {}
+     ],
+     [
       "mediacapture-record/MediaRecorder-stop.html?mimeType=video/webm;codecs=av1,opus",
       {}
      ],
@@ -634677,11 +634467,12 @@
       ]
      ],
      "focus-navigation-slots-in-slot.html": [
-      "39b080660344038a3e9a836ca819cb737a2f688c",
+      "3c929de7276fea5689b5738dc5d550f7a5ded235",
       [
        null,
        {
-        "testdriver": true
+        "testdriver": true,
+        "timeout": "long"
        }
       ]
      ],
@@ -634704,20 +634495,22 @@
       ]
      ],
      "focus-navigation-with-delegatesFocus.html": [
-      "64942a109e0281a5e0806214428ffbc8f05f8c6c",
+      "e37accbc8e2951fad326a430397dadd5165ebd63",
       [
        null,
        {
-        "testdriver": true
+        "testdriver": true,
+        "timeout": "long"
        }
       ]
      ],
      "focus-navigation.html": [
-      "9e593eb1003a26a9957d04ddca8cd522e7a0872e",
+      "faf3c34cdb2eb25cf334f0396fba1a727dac4663",
       [
        null,
        {
-        "testdriver": true
+        "testdriver": true,
+        "timeout": "long"
        }
       ]
      ],
@@ -717780,21 +717573,21 @@
          ]
         ],
         "invalid.py": [
-         "ecd3173e8784a8973453f1ad54e7ade61d235381",
+         "52aabca2670e45ae24a05ce49087dcfbf0de4a2d",
          [
           null,
           {}
          ]
         ],
         "locator.py": [
-         "e560fa9239dbcc86d74bd5084c3bc64b840dced1",
+         "66c512d792a46217b2f7ac125a7cf0ce7d7d05a3",
          [
           null,
           {}
          ]
         ],
         "max_node_count.py": [
-         "4652026e96fae72c40c1ce87cad9e5ef836b3725",
+         "9d9c05260bc0ba096c40cb7d9f3e598f8549c420",
          [
           null,
           {}
@@ -717808,7 +717601,7 @@
          ]
         ],
         "start_nodes.py": [
-         "707d83a337d8ff309e2727475f61e8940207b14b",
+         "f44a6d4857c0b62d58adb844042617cc622d0111",
          [
           null,
           {}
diff --git a/third_party/blink/web_tests/external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-parent-element-overflow-hidden-and-border-radius-2.html b/third_party/blink/web_tests/external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-parent-element-overflow-hidden-and-border-radius-2.html
new file mode 100644
index 0000000..0b12301
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-parent-element-overflow-hidden-and-border-radius-2.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <title>CSS Test: blending between an element having overflow:hidden and border-radius and its child, with will-change:opacity</title>
+        <link rel="author" title="Mirela Budăeș" href="mailto:mbudaes@adobe.com">
+        <link rel="author" title="Ion Roșca" href="mailto:rosca@adobe.com">
+        <link rel="author" title="Xianzhu Wang" href="mailto:wangxianzhu@chromium.org">
+        <link rel="help" href="https://drafts.fxtf.org/compositing-1/#mix-blend-mode">
+        <link rel="help" href="https://crbug.com/328339028">
+        <meta name="assert" content="Test checks that an element having mix-blend-mode and will-change:opacity blends with the parent element having overflow:hidden and border-radius">
+        <meta name="fuzzy" content="0-128;0-400">
+        <link rel="match" href="reference/mix-blend-mode-parent-element-overflow-hidden-and-border-radius-ref.html">
+        <style type="text/css">
+            .parent {
+                background: red;
+                width: 140px;
+                height: 140px;
+                position: relative;
+                z-index: 1;
+                overflow: hidden;
+                border-radius: 1em 5em;
+            }
+            .blended {
+                background: yellow;
+                width: 200px;
+                height: 200px;
+                mix-blend-mode: difference;
+                will-change: opacity;
+            }
+        </style>
+    </head>
+    <body>
+        <p> Test passes if you see a lime square with rounded corners.</p>
+        <div class="parent">
+            <div class="blended"></div>
+        </div>
+    </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-001-ref.html
index bd1cddd9..1a9f65a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-001-ref.html
@@ -15,24 +15,26 @@
 grid {
   display: inline-grid;
   gap: 1px 2px;
-  grid-template-columns: repeat(4,auto);
-  grid-auto-rows: 1em;
+  grid-auto-rows: auto;
   border: 1px solid;
   padding: 0 1px 0 2px;
   vertical-align: top;
 }
-.fr {
+.auto grid {
+  grid-template-columns: repeat(4,auto);
+}
+.fr grid {
   grid-template-columns: 1fr 2fr 1fr 1fr;
 }
-.mixed {
+.mixed grid {
   grid-template-columns: 1fr 2fr min-content max-content;
 }
 </style>
 
 <body>
 
-<section>
-<grid>
+<section class="auto">
+<grid style="grid-template-columns: repeat(4, 2ch)">
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -40,7 +42,7 @@
   <item>5</item>
 </grid>
 
-<grid style="grid-template-columns: 1ch repeat(3,auto)">
+<grid style="grid-template-columns: repeat(4, 2ch)">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -53,7 +55,7 @@
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:2ch; grid-column:2">5</item>
+  <item style="width:2ch; grid-area:1/2">5</item>
 </grid>
 
 <grid>
@@ -61,26 +63,28 @@
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:4ch; grid-column:2/span 2">5</item>
+  <item style="visibility: hidden">4</item>
+  <item style="width:4ch; grid-area:1/2/2/4">5</item>
 </grid>
 
 <grid>
-  <item>1</item>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="grid-area: 1/2/2/span 2">5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
 </grid>
 
-
 <grid>
-  <item>1</item>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:3ch; grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="width:3ch; grid-area:1/2/2/4">5</item>
+  <item style="width:5ch; grid-area:2/1/3/4">6</item>
 </grid>
 
 <grid>
@@ -99,19 +103,20 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid style="grid-template-columns: repeat(4,1ch)">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:6ch; grid-column:span 3">5</item>
+  <item style="width:6ch; grid-area: 2/1/3/4">5</item>
+  <item style="width:6ch; grid-area: 2/2/3/5; visibility: hidden">5</item>
 </grid>
 </section>
 
 <!-- ditto with 'fr' sizing -->
 
-<section>
-<grid class="fr">
+<section class="fr">
+<grid>
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -119,7 +124,7 @@
   <item>5</item>
 </grid>
 
-<grid class="fr" style="grid-template-columns: 1ch 2fr 1fr 1fr">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -127,42 +132,43 @@
   <item style="width:2ch">5</item>
 </grid>
 
-<grid class="fr">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:2ch; grid-column:2">5</item>
+  <item style="width:2ch; grid-area: 1/2">5</item>
 </grid>
 
-<grid class="fr">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:4ch; grid-column:2/span 2">5</item>
+  <item style="width:4ch; grid-area: 1/2/2/4">5</item>
 </grid>
 
-<grid class="fr">
-  <item>1</item>
+<grid>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="grid-area: 1/2/2/span 2">5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
 </grid>
 
-
-<grid class="fr">
-  <item>1</item>
+<grid>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:3ch; grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="width:3ch; grid-area:1/2/2/4">5</item>
+  <item style="width:5ch; grid-area:2/1/3/4">6</item>
 </grid>
 
-<grid class="fr">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -170,7 +176,7 @@
   <item style="grid-column:span 4">5</item>
 </grid>
 
-<grid class="fr">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -178,19 +184,20 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid class="fr" style="grid-template-columns: 1ch 2ch 1ch 1ch">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:6ch; grid-column:span 3">5</item>
+  <item style="width:6ch; grid-area: 2/1/3/4">5</item>
+  <item style="width:6ch; grid-area: 2/2/3/5; visibility: hidden">5</item>
 </grid>
 </section>
 
 <!-- ditto with mixed sizing -->
 
-<section>
-<grid class="mixed" style="grid-template-columns: 2ch 4ch 1ch 1ch">
+<section class="mixed">
+<grid style="grid-template-columns: 2ch 4ch 2ch 2ch">
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -198,7 +205,7 @@
   <item>5</item>
 </grid>
 
-<grid class="mixed" style="grid-template-columns: 1ch 2ch 1ch 1ch">
+<grid style="grid-template-columns: 2ch 4ch 2ch 2ch">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -206,42 +213,44 @@
   <item style="width:2ch">5</item>
 </grid>
 
-<grid class="mixed">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:2ch; grid-column:2">5</item>
+  <item style="width:2ch; grid-area: 1/2">5</item>
 </grid>
 
-<grid class="mixed">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:4ch; grid-column:2/span 2">5</item>
+  <item style="visibility: hidden">4</item>
+  <item style="width:4ch; grid-area: 1/2/2/4">5</item>
 </grid>
 
-<grid class="mixed">
-  <item>1</item>
+<grid>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="grid-area: 1/2/2/span 2">5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
 </grid>
 
-
-<grid class="mixed">
-  <item>1</item>
+<grid>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:3ch; grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="width:3ch; grid-area:1/2/2/4">5</item>
+  <item style="width:5ch; grid-area:2/1/3/4">6</item>
 </grid>
 
-<grid class="mixed">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -249,7 +258,7 @@
   <item style="grid-column:span 4">5</item>
 </grid>
 
-<grid class="mixed">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -257,12 +266,13 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid class="mixed" style="grid-template-columns: 1ch 2ch 1ch 1ch">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:6ch; grid-column:span 3">5</item>
+  <item style="width:6ch; grid-area: 2/1/3/4">5</item>
+  <item style="width:6ch; grid-area: 2/2/3/5; visibility: hidden">5</item>
 </grid>
 </section>
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-001.html
index 2dc9f6d..cc0608e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-001.html
@@ -36,7 +36,7 @@
 <body>
 
 <section class="auto">
-<grid title="Wider first item">
+<grid title="Wider 1st item 2ch">
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -44,7 +44,7 @@
   <item>5</item>
 </grid>
 
-<grid title="Wider last item">
+<grid title="Wider 5th item 2ch">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -52,7 +52,7 @@
   <item style="width:2ch">5</item>
 </grid>
 
-<grid title="Wider last item in col 2">
+<grid title="Wider 5th item 2ch in col 2">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -60,7 +60,7 @@
   <item style="width:2ch; grid-column:2">5</item>
 </grid>
 
-<grid title="Wider last item spanning col 2-3">
+<grid title="Wider 5th item 4ch in col 2-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -68,7 +68,7 @@
   <item style="width:4ch; grid-column:2/span 2">5</item>
 </grid>
 
-<grid title="Item spanning col 2-3, wider item spanning col 1-3">
+<grid title="5th item in col 2-3, wider 6th item 5ch in col 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -77,8 +77,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-
-<grid title="3ch item spanning 2-3, 5ch item spanning 1-3">
+<grid title="5th item 3ch in 2-3, 6th item 5ch in 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -87,7 +86,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Last item spanning 4">
+<grid title="5th item span 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -95,7 +94,7 @@
   <item style="grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 4">
+<grid title="5th item 6ch span 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -103,7 +102,7 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 3">
+<grid title="5th item 6ch span 3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -115,7 +114,7 @@
 <!-- ditto with 'fr' sizing -->
 
 <section class="fr">
-<grid title="Wider first item">
+<grid title="Wider 1st item 2ch">
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -123,7 +122,7 @@
   <item>5</item>
 </grid>
 
-<grid title="Wider last item">
+<grid title="Wider 5th item 2ch">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -131,7 +130,7 @@
   <item style="width:2ch">5</item>
 </grid>
 
-<grid title="Wider last item in col 2">
+<grid title="Wider 5th item 2ch in col 2">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -139,7 +138,7 @@
   <item style="width:2ch; grid-column:2">5</item>
 </grid>
 
-<grid title="Wider last item spanning col 2-3">
+<grid title="Wider 5th item 4ch in col 2-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -147,7 +146,7 @@
   <item style="width:4ch; grid-column:2/span 2">5</item>
 </grid>
 
-<grid title="Item spanning col 2-3, wider item spanning col 1-3">
+<grid title="5th item in col 2-3, wider 6th item 5ch in col 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -156,8 +155,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-
-<grid title="3ch item spanning 2-3, 5ch item spanning 1-3">
+<grid title="5th item 3ch in 2-3, 6th item 5ch in 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -166,7 +164,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Last item spanning 4">
+<grid title="5th item span 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -174,7 +172,7 @@
   <item style="grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 4">
+<grid title="5th item 6ch span 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -182,7 +180,7 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 3">
+<grid title="5th item 6ch span 3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -194,7 +192,7 @@
 <!-- ditto with mixed sizing -->
 
 <section class="mixed">
-<grid title="Wider first item">
+<grid title="Wider 1st item 2ch">
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -202,7 +200,7 @@
   <item>5</item>
 </grid>
 
-<grid title="Wider last item">
+<grid title="Wider 5th item 2ch">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -210,7 +208,7 @@
   <item style="width:2ch">5</item>
 </grid>
 
-<grid title="Wider last item in col 2">
+<grid title="Wider 5th item 2ch in col 2">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -218,7 +216,7 @@
   <item style="width:2ch; grid-column:2">5</item>
 </grid>
 
-<grid title="Wider last item spanning col 2-3">
+<grid title="Wider 5th item 4ch in col 2-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -226,7 +224,7 @@
   <item style="width:4ch; grid-column:2/span 2">5</item>
 </grid>
 
-<grid title="Item spanning col 2-3, wider item spanning col 1-3">
+<grid title="5th item in col 2-3, wider 6th item 5ch in col 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -236,7 +234,7 @@
 </grid>
 
 
-<grid title="3ch item spanning 2-3, 5ch item spanning 1-3">
+<grid title="5th item 3ch in 2-3, 6th item 5ch in 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -245,7 +243,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Last item spanning 4">
+<grid title="5th item span 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -253,7 +251,7 @@
   <item style="grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 4">
+<grid title="5th item 6ch span 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -261,7 +259,7 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 3">
+<grid title="5th item 6ch span 3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-002-ref.html
index 37f65bac..ddae8e7f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-002-ref.html
@@ -15,25 +15,27 @@
 grid {
   display: inline-grid;
   gap: 1px 2px;
-  grid-template-columns: repeat(4,auto);
   grid-auto-rows: 1em;
   border: 1px solid;
   padding: 0 1px 0 2px;
   vertical-align: top;
   width: min-content;
 }
-.fr {
+.auto grid {
+  grid-template-columns: repeat(4,auto);
+}
+.fr grid {
   grid-template-columns: 1fr 2fr 1fr 1fr;
 }
-.mixed {
+.mixed grid {
   grid-template-columns: 1fr 2fr min-content max-content;
 }
 </style>
 
 <body>
 
-<section>
-<grid>
+<section class="auto">
+<grid style="grid-template-columns: repeat(4, 2ch)">
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -41,7 +43,7 @@
   <item>5</item>
 </grid>
 
-<grid style="grid-template-columns: 1ch repeat(3,auto)">
+<grid style="grid-template-columns: repeat(4, 2ch)">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -54,7 +56,7 @@
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:2ch; grid-column:2">5</item>
+  <item style="width:2ch; grid-area:1/2">5</item>
 </grid>
 
 <grid>
@@ -62,26 +64,28 @@
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:4ch; grid-column:2/span 2">5</item>
+  <item style="visibility: hidden">4</item>
+  <item style="width:4ch; grid-area:1/2/2/4">5</item>
 </grid>
 
 <grid>
-  <item>1</item>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="grid-area: 1/2/2/span 2">5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
 </grid>
 
-
 <grid>
-  <item>1</item>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:3ch; grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="width:3ch; grid-area:1/2/2/4">5</item>
+  <item style="width:5ch; grid-area:2/1/3/4">6</item>
 </grid>
 
 <grid>
@@ -100,19 +104,20 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid style="grid-template-columns: repeat(4,1ch)">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:6ch; grid-column:span 3">5</item>
+  <item style="width:6ch; grid-area: 2/1/3/4">5</item>
+  <item style="width:6ch; grid-area: 2/2/3/5; visibility: hidden">5</item>
 </grid>
 </section>
 
 <!-- ditto with 'fr' sizing -->
 
-<section>
-<grid class="fr">
+<section class="fr">
+<grid style="grid-template-columns: repeat(4, 2ch)">
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -120,7 +125,7 @@
   <item>5</item>
 </grid>
 
-<grid class="fr" style="grid-template-columns: 1ch 2fr 1fr 1fr">
+<grid style="grid-template-columns: repeat(4, 2ch)">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -128,42 +133,43 @@
   <item style="width:2ch">5</item>
 </grid>
 
-<grid class="fr">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:2ch; grid-column:2">5</item>
+  <item style="width:2ch; grid-area: 1/2">5</item>
 </grid>
 
-<grid class="fr">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:4ch; grid-column:2/span 2">5</item>
+  <item style="width:4ch; grid-area: 1/2/2/4">5</item>
 </grid>
 
-<grid class="fr">
-  <item>1</item>
+<grid>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="grid-area: 1/2/2/span 2">5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
 </grid>
 
-
-<grid class="fr">
-  <item>1</item>
+<grid>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:3ch; grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="width:3ch; grid-area:1/2/2/4">5</item>
+  <item style="width:5ch; grid-area:2/1/3/4">6</item>
 </grid>
 
-<grid class="fr">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -171,7 +177,7 @@
   <item style="grid-column:span 4">5</item>
 </grid>
 
-<grid class="fr">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -179,19 +185,20 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid class="fr" style="grid-template-columns: 1ch 1ch 1ch 1ch">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:6ch; grid-column:span 3">5</item>
+  <item style="width:6ch; grid-area: 2/1/3/4">5</item>
+  <item style="width:6ch; grid-area: 2/2/3/5; visibility: hidden">5</item>
 </grid>
 </section>
 
 <!-- ditto with mixed sizing -->
 
-<section>
-<grid class="mixed" style="grid-template-columns: 2ch 1ch 1ch 1ch">
+<section class="mixed">
+<grid style="grid-template-columns: repeat(4, 2ch)">
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -199,7 +206,7 @@
   <item>5</item>
 </grid>
 
-<grid class="mixed" style="grid-template-columns: 1ch 1ch 1ch 1ch">
+<grid style="grid-template-columns: repeat(4, 2ch)">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -207,42 +214,44 @@
   <item style="width:2ch">5</item>
 </grid>
 
-<grid class="mixed">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:2ch; grid-column:2">5</item>
+  <item style="width:2ch; grid-area: 1/2">5</item>
 </grid>
 
-<grid class="mixed">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:4ch; grid-column:2/span 2">5</item>
+  <item style="visibility: hidden">4</item>
+  <item style="width:4ch; grid-area: 1/2/2/4">5</item>
 </grid>
 
-<grid class="mixed">
-  <item>1</item>
+<grid>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="grid-area: 1/2/2/span 2">5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
 </grid>
 
-
-<grid class="mixed">
-  <item>1</item>
+<grid>
+  <item style="grid-column: 4">1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:3ch; grid-column:2/span 2">5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="visibility: hidden">4</item>
+  <item style="width:3ch; grid-area:1/2/2/4">5</item>
+  <item style="width:5ch; grid-area:2/1/3/4">6</item>
 </grid>
 
-<grid class="mixed">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -250,7 +259,7 @@
   <item style="grid-column:span 4">5</item>
 </grid>
 
-<grid class="mixed">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -258,12 +267,14 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid class="mixed" style="grid-template-columns: 1ch 1ch 1ch 1ch">
+<grid>
   <item>1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="width:6ch; grid-column:span 3">5</item>
+  <item style="width:6ch; grid-area: 2/1/3/4">5</item>
+  <item style="width:6ch; grid-area: 2/2/3/5; visibility: hidden">5</item>
 </grid>
 </section>
 
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-002.html
index b8228ce..3867bb13 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-002.html
@@ -38,7 +38,7 @@
 <body>
 
 <section class="auto">
-<grid title="Wider first item">
+<grid title="Wider 1st item 2ch">
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -46,7 +46,7 @@
   <item>5</item>
 </grid>
 
-<grid title="Wider last item">
+<grid title="Wider 5th item 2ch">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -54,7 +54,7 @@
   <item style="width:2ch">5</item>
 </grid>
 
-<grid title="Wider last item in col 2">
+<grid title="Wider 5th item 2ch in col 2">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -62,7 +62,7 @@
   <item style="width:2ch; grid-column:2">5</item>
 </grid>
 
-<grid title="Wider last item spanning col 2-3">
+<grid title="Wider 5th item 4ch in col 2-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -70,7 +70,7 @@
   <item style="width:4ch; grid-column:2/span 2">5</item>
 </grid>
 
-<grid title="Item spanning col 2-3, wider item spanning col 1-3">
+<grid title="5th item in col 2-3, wider 6th item 5ch in col 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -79,8 +79,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-
-<grid title="3ch item spanning 2-3, 5ch item spanning 1-3">
+<grid title="5th item 3ch in 2-3, 6th item 5ch in 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -89,7 +88,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Last item spanning 4">
+<grid title="5th item spanning 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -97,7 +96,7 @@
   <item style="grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 4">
+<grid title="5th item 6ch spanning 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -105,7 +104,7 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 3">
+<grid title="5th item 6ch spanning 3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -117,7 +116,7 @@
 <!-- ditto with 'fr' sizing -->
 
 <section class="fr">
-<grid title="Wider first item">
+<grid title="Wider 1st item 2ch">
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -125,7 +124,7 @@
   <item>5</item>
 </grid>
 
-<grid title="Wider last item">
+<grid title="Wider 5th item 2ch">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -133,7 +132,7 @@
   <item style="width:2ch">5</item>
 </grid>
 
-<grid title="Wider last item in col 2">
+<grid title="Wider 5th item 2ch in col 2">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -141,7 +140,7 @@
   <item style="width:2ch; grid-column:2">5</item>
 </grid>
 
-<grid title="Wider last item spanning col 2-3">
+<grid title="Wider 5th item 4ch in col 2-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -149,7 +148,7 @@
   <item style="width:4ch; grid-column:2/span 2">5</item>
 </grid>
 
-<grid title="Item spanning col 2-3, wider item spanning col 1-3">
+<grid title="5th item in col 2-3, wider 6th item 5ch in col 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -158,8 +157,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-
-<grid title="3ch item spanning 2-3, 5ch item spanning 1-3">
+<grid title="5th item 3ch in 2-3, 6th item 5ch in 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -168,7 +166,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Last item spanning 4">
+<grid title="5th item span 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -176,7 +174,7 @@
   <item style="grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 4">
+<grid title="5th item 6ch span 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -184,7 +182,7 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 3">
+<grid title="5th item 6ch span 3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -196,7 +194,7 @@
 <!-- ditto with mixed sizing -->
 
 <section class="mixed">
-<grid title="Wider first item">
+<grid title="Wider 1st item 2ch">
   <item style="width:2ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -204,7 +202,7 @@
   <item>5</item>
 </grid>
 
-<grid title="Wider last item">
+<grid title="Wider 5th item 2ch">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -212,7 +210,7 @@
   <item style="width:2ch">5</item>
 </grid>
 
-<grid title="Wider last item in col 2">
+<grid title="Wider 5th item 2ch in col 2">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -220,7 +218,7 @@
   <item style="width:2ch; grid-column:2">5</item>
 </grid>
 
-<grid title="Wider last item spanning col 2-3">
+<grid title="Wider 5th item 4ch in col 2-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -228,7 +226,7 @@
   <item style="width:4ch; grid-column:2/span 2">5</item>
 </grid>
 
-<grid title="Item spanning col 2-3, wider item spanning col 1-3">
+<grid title="5th item in col 2-3, wider 6th item 5ch in col 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -237,8 +235,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-
-<grid title="3ch item spanning 2-3, 5ch item spanning 1-3">
+<grid title="5th item 3ch in 2-3, 6th item 5ch in 1-3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -247,7 +244,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Last item spanning 4">
+<grid title="5th item spanning 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -255,7 +252,7 @@
   <item style="grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 4">
+<grid title="5th item 6ch spanning 4">
   <item>1</item>
   <item>2</item>
   <item>3</item>
@@ -263,7 +260,7 @@
   <item style="width:6ch; grid-column:span 4">5</item>
 </grid>
 
-<grid title="6ch last item spanning 3">
+<grid title="5th item 6ch spanning 3">
   <item>1</item>
   <item>2</item>
   <item>3</item>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-003-ref.html
index 886c147..044750d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-003-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-003-ref.html
@@ -15,7 +15,6 @@
 grid {
   display: inline-grid;
   gap: 1px 2px;
-  grid-auto-rows: 1em;
   border: 1px solid;
   padding: 0 1px 0 2px;
   vertical-align: top;
@@ -31,240 +30,304 @@
   grid-template-columns: 1fr 2fr min-content max-content;
 }
 
-item.start { align-self: start; }
+item {
+  align-self: start;
+}
+.hidden {
+  visibility: hidden;
+  height: 0;
+}
 </style>
 
 <body>
 
 <section class="auto">
-<grid style="grid-template-rows: 1em 2em">
+<grid style="grid-template-columns: repeat(4, 2ch)">
   <item style="width:2ch">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
   <item>4</item>
-  <item>5 5</item>
+  <item style="grid-row: span 2">5 5</item>
 </grid>
 
-<grid style="grid: 1em 2em / 1ch repeat(3,auto); ">
+<grid style="grid-template-columns: repeat(4, 2ch)">
   <item>1</item>
-  <item>2 2</item>
-  <item>3 3</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
   <item>4</item>
-  <item style="width:2ch">5 5</item>
+  <item style="grid-row: span 2">5 5</item>
 </grid>
 
-<grid style="grid-template-rows: 2em 2em">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:2ch; grid-column:2">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:2ch; grid-area: 1/2/3">5 5</item>
 </grid>
 
-<grid style="grid-template-rows: 2em 1em">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:4ch; grid-column:2/span 2">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:4ch; grid-area: 1/2/auto/4">5 5</item>
+
+  <item class="hidden">0</item>
 </grid>
 
-<grid style="grid-template-rows: 2em 1em">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+<grid>
+  <item style="grid-column: 4">1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+
+  <item class="hidden">0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid-template-rows: 2em 1em">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:3ch; grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+<grid>
+  <item style="grid-column: 4">1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:3ch; grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+
+  <item class="hidden">0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid-template-rows: 2em 1em">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:span 4">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="grid-area: 3/1/4/5">5 5</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid-template-rows: 2em 1em">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 4">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 3/1/4/5">5 5</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid: 2em 1em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 3">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 3/1/4/4">5 5</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden" style="width:6ch; grid-area: 3/2/4/5">0 0</item>
 </grid>
 </section>
 
 <!-- ditto with 'fr' sizing -->
 
 <section class="fr">
-<grid style="grid: 1em 2em / 2ch 2fr 1fr 1fr">
-  <item style="width:2ch" class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item>5 5</item>
+<grid style="grid-template-columns: repeat(4, 2ch)">
+  <item style="width:2ch">1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="grid-row: span 2">5 5</item>
 </grid>
 
-<grid style="grid: 1em 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:2ch">5 5</item>
+<grid style="grid-template-columns: repeat(4, 2ch)">
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="grid-row: span 2">5 5</item>
 </grid>
 
-<grid style="grid: 2em 2em / 1ch 2ch repeat(2,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:2ch; grid-column:2">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:2ch; grid-area: 1/2/3">5 5</item>
 </grid>
 
-<grid style="grid: 2em 1em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:4ch; grid-column:2/span 2">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:4ch; grid-area: 1/2/auto/4">5 5</item>
+  <item class="hidden">0</item>
 </grid>
 
-<grid style="grid: 2em 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+<grid>
+  <item style="grid-column: 4">1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+  <item class="hidden">0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid: 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:3ch; grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+<grid>
+  <item style="grid-column: 4">1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:3ch; grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+
+  <item class="hidden">0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid: 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:span 4">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="grid-area: 3/1/4/5">5 5</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid: 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 4">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 3/1/4/5">5 5</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid: 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 3">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 3/1/4/4">5 5</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden" style="width:6ch; grid-area: 3/2/4/5">0 0</item>
 </grid>
 </section>
 
 <!-- ditto with mixed sizing -->
 
 <section class="mixed">
-<grid style="grid: 1em 2em / 2ch repeat(3,1ch)">
-  <item style="width:2ch" class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item>5 5</item>
+<grid style="grid-template-columns: repeat(3, 2ch) max-content">
+  <item style="width:2ch">1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="grid-row: span 2">5 5</item>
+  <item class="hidden" style="grid-area: 2/4/4">0 0</item>
 </grid>
 
-<grid style="grid: 1em 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:2ch">5 5</item>
+<grid style="grid-template-columns: repeat(3, 2ch) max-content">
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="grid-row: span 2">5 5</item>
+  <item class="hidden" style="grid-area: 2/4/4">0 0</item>
 </grid>
 
-<grid style="grid: 2em 2em / 1ch 2ch repeat(2,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:2ch; grid-column:2">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:2ch; grid-area: 1/2/3">5 5</item>
 </grid>
 
-<grid style="grid: 2em 1em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:4ch; grid-column:2/span 2">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:4ch; grid-area: 1/2/auto/4">5 5</item>
+  <item class="hidden">0</item>
 </grid>
 
-<grid style="grid: 2em 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+<grid>
+  <item style="grid-column: 4">1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+  <item class="hidden">0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid: 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:3ch; grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+<grid>
+  <item style="grid-column: 4">1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:3ch; grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+
+  <item class="hidden">0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid: 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:span 4">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="grid-area: 3/1/4/5">5 5</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid: 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 4">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 3/1/4/5">5 5</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid: 2em / repeat(4,1ch)">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 3">5 5</item>
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 3/1/4/4">5 5</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden" style="width:6ch; grid-area: 3/2/4/5">0 0</item>
 </grid>
 </section>
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-003.html
index 80bf5d5d..48489d3c 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-003.html
@@ -37,7 +37,7 @@
 <body>
 
 <section class="auto">
-<grid title="Wider first item 2ch">
+<grid title="Wider 1st item 2ch">
   <item style="width:2ch">1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -45,7 +45,7 @@
   <item>5 5</item>
 </grid>
 
-<grid title="Wrapped last item 2ch">
+<grid title="Wrapped 5th item 2ch">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -53,7 +53,7 @@
   <item style="width:2ch">5 5</item>
 </grid>
 
-<grid title="Wrapped last item 2ch col 2">
+<grid title="Wrapped 5th item 2ch col 2">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -61,7 +61,7 @@
   <item style="width:2ch; grid-column:2">5 5</item>
 </grid>
 
-<grid title="Last item 4ch col 2-3">
+<grid title="5th item 4ch in col 2-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -69,7 +69,7 @@
   <item style="width:4ch; grid-column:2/span 2">5 5</item>
 </grid>
 
-<grid title="Item col 2-3 + Item 5ch col 1-3">
+<grid title="5th item in col 2-3, 6th item 5ch in col 1-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -78,7 +78,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Item 3ch col 2-3 + Item 5ch col 1-3">
+<grid title="5th item 3ch in col 2-3, 6th item 5ch in col 1-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -87,7 +87,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Last item span 4">
+<grid title="5th item span 4">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -95,7 +95,7 @@
   <item style="grid-column:span 4">5 5</item>
 </grid>
 
-<grid title="Last item 6ch span 4">
+<grid title="5th item 6ch span 4">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -103,7 +103,7 @@
   <item style="width:6ch; grid-column:span 4">5 5</item>
 </grid>
 
-<grid title="Last item 6ch span 3">
+<grid title="5th item 6ch span 3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-004-ref.html
index 166a467..302dcad 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-004-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-004-ref.html
@@ -15,7 +15,6 @@
 grid {
   display: inline-grid;
   gap: 1px 2px;
-  grid-auto-rows: 1em;
   border: 1px solid;
   padding: 0 1px 0 2px;
   vertical-align: top;
@@ -23,7 +22,7 @@
   width: max-content;
 }
 .auto grid {
-  grid-template-columns: 1ch 3ch 3ch 1ch;
+  grid-template-columns: repeat(4, auto);
 }
 .fr grid {
   grid-template-columns: 1fr 2fr 1fr 1fr;
@@ -31,84 +30,122 @@
 .mixed grid {
   grid-template-columns: 1fr 2fr min-content max-content;
 }
-item.start { align-self: start; }
+
+item {
+  align-self: start;
+}
+.hidden {
+  visibility: hidden;
+  height: 0;
+}
 </style>
 
 <body>
 
 <section class="auto">
-<grid style="grid: 1em 2em / 2ch 3ch 3ch 1ch">
+<grid>
   <item style="width:2ch">1</item>
   <item>2 2</item>
   <item>3 3</item>
   <item>4</item>
   <item>5 5</item>
+
+  <item class="hidden" style="grid-column: 4">0 0</item>
 </grid>
 
-<grid style="grid: 1em 2em / 1ch 3ch 3ch 1ch; ">
+<grid>
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
   <item>4</item>
-  <item style="width:2ch">5 5</item>
-</grid>
+  <item style="width: 2ch; grid-area: 2/1">5 5</item>
 
-<grid style="grid-template-rows: 1em 2em">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:2ch; grid-column:2">5 5</item>
+  <item class="hidden" style="grid-area: 2/1">0 0</item>
+  <item class="hidden" style="grid-area: 2/4">0 0</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:4ch; grid-column:2/span 2">5 5</item>
+  <item style="grid-area: 2/1">4</item>
+  <item style="width:2ch; grid-area: 1/2/3">5 5</item>
+
+  <item class="hidden" style="grid-area: 2/1">0 0</item>
+  <item class="hidden" style="grid-area: 2/2">0 0</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item style="grid-area: 2/2">4</item>
+  <item style="width:4ch; grid-area: 1/2/auto/4">5 5</item>
+
+  <item class="hidden" style="grid-area: 2/2">0 0</item>
+  <item class="hidden" style="grid-area: 2/3">0 0</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item style="grid-area: 1/4">1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:3ch; grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item>4</item>
+  <item style="grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+
+  <item class="hidden" style="grid-area: 1/1">0</item>
+  <item class="hidden" style="grid-area: 2/2">0 0</item>
+  <item class="hidden" style="grid-area: 2/3">0 0</item>
+  <item class="hidden" style="grid-area: 1/4">0 0</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item style="grid-area: 1/4">1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:span 4">5 5</item>
+  <item>4</item>
+  <item style="width:3ch; grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+
+  <item class="hidden" style="grid-area: 1/1">0</item>
+  <item class="hidden" style="grid-area: 2/2">0 0</item>
+  <item class="hidden" style="grid-area: 2/3">0 0</item>
+  <item class="hidden" style="grid-area: 1/4">0 0</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 4">5 5</item>
+  <item>4</item>
+  <item style="grid-area: 2/1/3/5">5 5</item>
+
+  <item class="hidden" style="grid-area: 2/1">0 0</item>
+  <item class="hidden" style="grid-area: 2/4">0 0</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 3">5 5</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 2/1/3/5">5 5</item>
+
+  <item class="hidden" style="grid-area: 2/1">0 0</item>
+  <item class="hidden" style="grid-area: 2/4">0 0</item>
+</grid>
+
+<grid>
+  <item>1</item>
+  <item>2 2</item>
+  <item>3 3</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 2/1/3/4">5 5</item>
+
+  <item class="hidden" style="grid-area: 2/1">0 0</item>
+  <item class="hidden" style="grid-area: 2/4">0 0</item>
+  <item class="hidden" style="width:6ch; grid-area: 2/2/3/5">0 0</item>
 </grid>
 </section>
 
@@ -116,155 +153,205 @@
 
 <section class="fr">
 <grid>
-  <item style="width:2ch" class="start">1</item>
+  <item style="width:2ch">1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
+  <item>4</item>
   <item>5 5</item>
-</grid>
-
-<grid style="grid: 1em 2em / 3ch 6ch 3ch 3ch">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:2ch">5 5</item>
-</grid>
-
-<grid style="grid: 1em 2em / 3ch 6ch 3ch 3ch">
-  <item class="start">1</item>
-  <item>2 2</item>
-  <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:2ch; grid-column:2">5 5</item>
+  <item class="hidden" style="grid-area: 2/4/4">0 0</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:4ch; grid-column:2/span 2">5 5</item>
+  <item>4</item>
+  <item style="width: 2ch">5 5</item>
+  <item class="hidden" style="grid-area: 2/4">0 0</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item>4</item>
+  <item style="width:2ch; grid-area: 1/2/3">5 5</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:3ch; grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+  <item>4</item>
+  <item style="width:4ch; grid-area: 1/2/auto/4">5 5</item>
+  <item class="hidden">0</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item style="grid-area: 1/4">1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:span 4">5 5</item>
+  <item>4</item>
+  <item style="grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+
+  <item class="hidden" style="grid-area: 1/1">0</item>
+  <item class="hidden" style="grid-area: 2/2">0 0</item>
+  <item class="hidden" style="grid-area: 2/3">0 0</item>
+  <item class="hidden" style="grid-area: 1/4">0 0</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item style="grid-area: 1/4">1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 4">5 5</item>
+  <item>4</item>
+  <item style="width:3ch; grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+
+  <item class="hidden" style="grid-area: 1/1">0</item>
+  <item class="hidden" style="grid-area: 2/2">0 0</item>
+  <item class="hidden" style="grid-area: 2/3">0 0</item>
+  <item class="hidden" style="grid-area: 1/4">0 0</item>
 </grid>
 
 <grid>
-  <item class="start">1</item>
+  <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 3">5 5</item>
+  <item>4</item>
+  <item style="grid-area: 2/1/3/5">5 5</item>
+
+  <item class="hidden" style="grid-area: 2/1">0 0</item>
+  <item class="hidden" style="grid-area: 2/4">0 0</item>
+</grid>
+
+<grid>
+  <item>1</item>
+  <item>2 2</item>
+  <item>3 3</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 2/1/3/5">5 5</item>
+
+  <item class="hidden" style="grid-area: 2/1">0 0</item>
+  <item class="hidden" style="grid-area: 2/4">0 0</item>
+</grid>
+
+<grid>
+  <item>1</item>
+  <item>2 2</item>
+  <item>3 3</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 2/1/3/4">5 5</item>
+
+  <item class="hidden" style="grid-area: 2/1">0 0</item>
+  <item class="hidden" style="grid-area: 2/4">0 0</item>
+  <item class="hidden" style="width:6ch; grid-area: 2/2/3/5">0 0</item>
 </grid>
 </section>
 
 <!-- ditto with mixed sizing -->
 
 <section class="mixed">
-<grid style="grid: 1em 2em / 2ch 4ch 1ch 1ch">
-  <item style="width:2ch" class="start">1</item>
+<grid>
+  <item style="width:2ch">1</item>
+  <item>2 2</item>
+  <item style="grid-area: 1/3/3">3 3</item>
+  <item>4</item>
+  <item style="grid-area: 2/1">5 5</item>
+
+  <item class="hidden" style="grid-area: 2/3; width: 2ch">0</item>
+  <item class="hidden" style="grid-area: 2/4">0 0</item>
+</grid>
+
+<grid>
+  <item>1</item>
+  <item>2 2</item>
+  <item style="grid-area: 1/3/3">3 3</item>
+  <item>4</item>
+  <item style="width: 2ch; grid-area: 2/1">5 5</item>
+
+  <item class="hidden" style="grid-area: 2/3; width: 2ch">0</item>
+  <item class="hidden" style="grid-area: 2/4">0 0</item>
+</grid>
+
+<grid>
+  <item>1</item>
+  <item style="grid-row: span 2">2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item style="grid-area: 2/1">4</item>
+  <item style="width:2ch; grid-area: 1/2/3">5 5</item>
+
+  <item class="hidden" style="grid-area: 2/1">0 0</item>
+</grid>
+
+<grid>
+  <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item>5 5</item>
+  <item>4</item>
+  <item style="width:4ch; grid-area: 1/2/auto/4">5 5</item>
+
+  <item class="hidden">0</item>
 </grid>
 
-<grid style="grid: 1em 2em / calc(3ch/2) 3ch 1ch 1ch">
-  <item class="start">1</item>
+<grid>
+  <item style="grid-column: 4">1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:2ch">5 5</item>
+  <item>4</item>
+  <item style="grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden" style="grid-area: 2/2">0 0</item>
 </grid>
 
-<grid style="grid: 1em 2em / calc(3ch/2) 3ch 1ch 1ch">
-  <item class="start">1</item>
+<grid>
+  <item style="grid-column: 4">1</item>
   <item>2 2</item>
   <item>3 3</item>
-  <item class="start">4</item>
-  <item style="width:2ch; grid-column:2">5 5</item>
+  <item>4</item>
+  <item style="width:3ch; grid-area: 1/2/2/4">5 5</item>
+  <item style="width:5ch; grid-area: 2/1/3/4">6</item>
+
+  <item class="hidden" style="grid-area: 2/3">0 0</item>
 </grid>
 
-<grid style="grid: 2em 1em / calc(3ch/2) 3ch 1ch 1ch">
-  <item class="start">1</item>
-  <item class="start">2 2</item>
-  <item class="start">3 3</item>
-  <item class="start">4</item>
-  <item style="width:4ch; grid-column:2/span 2">5 5</item>
+<grid>
+  <item>1</item>
+  <item>2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="grid-area: 3/1/4/5">5 5</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid: 2em 1em 1em / calc(3ch/2) 3ch 1ch 1ch">
-  <item class="start">1</item>
-  <item class="start">2 2</item>
-  <item class="start">3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
+<grid>
+  <item>1</item>
+  <item>2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 3/1/4/5">5 5</item>
+
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
 </grid>
 
-<grid style="grid: 2em 1em / calc(3ch/2) 3ch 1ch 1ch">
-  <item class="start">1</item>
-  <item class="start">2 2</item>
-  <item class="start">3 3</item>
-  <item class="start">4</item>
-  <item style="width:3ch; grid-column:2/span 2">5 5</item>
-  <item style="width:5ch; grid-column:1/span 3">6</item>
-</grid>
+<grid>
+  <item>1</item>
+  <item>2 2</item>
+  <item style="grid-row: span 2">3 3</item>
+  <item>4</item>
+  <item style="width:6ch; grid-area: 3/1/4/4">5 5</item>
 
-<grid style="grid: 2em 1em / calc(3ch/2) 3ch 1ch 1ch">
-  <item class="start">1</item>
-  <item class="start">2 2</item>
-  <item class="start">3 3</item>
-  <item class="start">4</item>
-  <item style="grid-column:span 4">5 5</item>
-</grid>
-
-<grid style="grid: 2em 1em / calc(3ch/2) 3ch 1ch 1ch">
-  <item class="start">1</item>
-  <item class="start">2 2</item>
-  <item class="start">3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 4">5 5</item>
-</grid>
-
-<grid style="grid: 2em 1em / calc(3ch/2) 3ch 1ch 1ch">
-  <item class="start">1</item>
-  <item class="start">2 2</item>
-  <item class="start">3 3</item>
-  <item class="start">4</item>
-  <item style="width:6ch; grid-column:span 3">5 5</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden">0 0</item>
+  <item class="hidden" style="width:6ch; grid-area: 3/2/4/5">0 0</item>
 </grid>
 </section>
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-004.html
index 70a52f37..c8bc671 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-004.html
@@ -37,7 +37,7 @@
 <body>
 
 <section class="auto">
-<grid title="Wider first item 2ch">
+<grid title="Wider 1st item 2ch">
   <item style="width:2ch">1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -45,7 +45,7 @@
   <item>5 5</item>
 </grid>
 
-<grid title="Wrapped last item 2ch">
+<grid title="Wrapped 5th item 2ch">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -53,7 +53,7 @@
   <item style="width:2ch">5 5</item>
 </grid>
 
-<grid title="Wrapped last item 2ch col 2">
+<grid title="Wrapped 5th item 2ch in col 2">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -61,7 +61,7 @@
   <item style="width:2ch; grid-column:2">5 5</item>
 </grid>
 
-<grid title="Last item 4ch col 2-3">
+<grid title="5th item 4ch in col 2-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -69,7 +69,7 @@
   <item style="width:4ch; grid-column:2/span 2">5 5</item>
 </grid>
 
-<grid title="Item col 2-3 + Item 5ch col 1-3">
+<grid title="4th item in col 2-3, 5th item 5ch in col 1-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -78,7 +78,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Item 3ch col 2-3 + Item 5ch col 1-3">
+<grid title="5th item 3ch in col 2-3, 6th item 5ch in col 1-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -87,7 +87,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Last item span 4">
+<grid title="5th item span 4">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -95,7 +95,7 @@
   <item style="grid-column:span 4">5 5</item>
 </grid>
 
-<grid title="Last item 6ch span 4">
+<grid title="5th item 6ch span 4">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -103,7 +103,7 @@
   <item style="width:6ch; grid-column:span 4">5 5</item>
 </grid>
 
-<grid title="Last item 6ch span 3">
+<grid title="5th item 6ch span 3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -115,7 +115,7 @@
 <!-- ditto with 'fr' sizing -->
 
 <section class="fr">
-<grid title="Wider first item 2ch">
+<grid title="Wider 1st item 2ch">
   <item style="width:2ch">1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -123,7 +123,7 @@
   <item>5 5</item>
 </grid>
 
-<grid title="Wrapped last item 2ch">
+<grid title="Wrapped 5th item 2ch">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -131,7 +131,7 @@
   <item style="width:2ch">5 5</item>
 </grid>
 
-<grid title="Wrapped last item 2ch col 2">
+<grid title="Wrapped 5th item 2ch in col 2">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -139,7 +139,7 @@
   <item style="width:2ch; grid-column:2">5 5</item>
 </grid>
 
-<grid title="Last item 4ch col 2-3">
+<grid title="5th item 4ch in col 2-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -147,7 +147,7 @@
   <item style="width:4ch; grid-column:2/span 2">5 5</item>
 </grid>
 
-<grid title="Item col 2-3 + Item 5ch col 1-3">
+<grid title="4th item in col 2-3, 5th item 5ch in col 1-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -156,7 +156,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Item 3ch col 2-3 + Item 5ch col 1-3">
+<grid title="5th item 3ch in col 2-3, 6th item 5ch in col 1-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -165,7 +165,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Last item span 4">
+<grid title="5th item span 4">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -173,7 +173,7 @@
   <item style="grid-column:span 4">5 5</item>
 </grid>
 
-<grid title="Last item 6ch span 4">
+<grid title="5th item 6ch span 4">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -181,7 +181,7 @@
   <item style="width:6ch; grid-column:span 4">5 5</item>
 </grid>
 
-<grid title="Last item 6ch span 3">
+<grid title="5th item 6ch span 3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -193,7 +193,7 @@
 <!-- ditto with mixed sizing -->
 
 <section class="mixed">
-<grid title="Wider first item 2ch">
+<grid title="Wider 1st item 2ch">
   <item style="width:2ch">1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -201,7 +201,7 @@
   <item>5 5</item>
 </grid>
 
-<grid title="Wrapped last item 2ch">
+<grid title="Wrapped 5th item 2ch">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -209,7 +209,7 @@
   <item style="width:2ch">5 5</item>
 </grid>
 
-<grid title="Wrapped last item 2ch col 2">
+<grid title="Wrapped 5th item 2ch in col 2">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -217,7 +217,7 @@
   <item style="width:2ch; grid-column:2">5 5</item>
 </grid>
 
-<grid title="Last item 4ch col 2-3">
+<grid title="5th item 4ch in col 2-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -225,7 +225,7 @@
   <item style="width:4ch; grid-column:2/span 2">5 5</item>
 </grid>
 
-<grid title="Item col 2-3 + Item 5ch col 1-3">
+<grid title="4th item in col 2-3, 5th item 5ch in col 1-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -234,7 +234,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Item 3ch col 2-3 + Item 5ch col 1-3">
+<grid title="5th item 3ch in col 2-3, 6th item 5ch in col 1-3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -243,7 +243,7 @@
   <item style="width:5ch; grid-column:1/span 3">6</item>
 </grid>
 
-<grid title="Last item span 4">
+<grid title="5th item span 4">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -251,7 +251,7 @@
   <item style="grid-column:span 4">5 5</item>
 </grid>
 
-<grid title="Last item 6ch span 4">
+<grid title="5th item 6ch span 4">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
@@ -259,7 +259,7 @@
   <item style="width:6ch; grid-column:span 4">5 5</item>
 </grid>
 
-<grid title="Last item 6ch span 3">
+<grid title="5th item 6ch span 3">
   <item>1</item>
   <item>2 2</item>
   <item>3 3</item>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-005-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-005-ref.html
index 4822580..725f646e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-005-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-005-ref.html
@@ -5,7 +5,7 @@
 -->
 <html>
   <meta charset="utf-8">
-  <title>Reference: Masonry layout intrinsic sizing</title>
+  <title>Reference: Masonry layout row sizing (vertical writing mode)</title>
   <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
   <link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
   <style>
@@ -15,6 +15,7 @@
 grid {
   display: inline-grid;
   gap: 1px 2px;
+  grid-template-rows: repeat(4,auto);
   grid-auto-flow: column;
   border: 1px solid;
   padding: 0 1px 0 2px;
@@ -27,7 +28,7 @@
 
 <body>
 
-<grid style="grid-template-rows: 3ch repeat(3,1ch)">
+<grid style="grid-template-rows: repeat(4, 3ch)">
   <item style="height:3ch">1</item>
   <item>2</item>
   <item>3</item>
@@ -39,7 +40,7 @@
   <item>9 9</item>
 </grid>
 
-<grid style="grid-template-rows: repeat(4,1ch)">
+<grid style="grid-template-rows: repeat(4,3ch)">
   <item>1</item>
   <item>2</item>
   <item>3</item>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-006-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-006-ref.html
index a616fad..1a88c2b 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-006-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-006-ref.html
@@ -5,7 +5,7 @@
 -->
 <html>
   <meta charset="utf-8">
-  <title>Reference: Masonry layout intrinsic sizing</title>
+  <title>Reference: Masonry layout row auto-fill sizing</title>
   <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
   <link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
   <style>
@@ -16,7 +16,6 @@
   display: inline-grid;
   gap: 1px 2px;
   grid-auto-flow: column;
-  grid-template-columns: 1ch;
   grid-template-rows: repeat(4,1em);
   border: 1px solid;
   padding: 0 1px 0 2px;
@@ -27,26 +26,26 @@
 <body>
 
 <grid>
-  <item style="width:3ch">1 1</item>
+  <item style="width:3ch; grid-column: span 2">1 1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="grid-row:2">5 5</item>
+  <item style="grid-column: span 2">5 5</item>
 </grid>
 
 <grid>
-  <item style="width:3ch">1 1</item>
+  <item style="width:3ch; grid-column: span 2">1 1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="grid-row:2">5 5</item>
+  <item style="grid-column: span 2">5 5</item>
 </grid>
 
 <grid style="height:5em">
-  <item style="width:3ch">1 1</item>
+  <item style="width:3ch; grid-column: span 2">1 1</item>
   <item>2</item>
   <item>3</item>
   <item>4</item>
-  <item style="grid-row:2">5 5</item>
+  <item style="grid-column: span 2">5 5</item>
 </grid>
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-006.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-006.html
index fccc116..ad54800 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-006.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-006.html
@@ -5,7 +5,7 @@
 -->
 <html>
   <meta charset="utf-8">
-  <title>CSS Grid Test: Masonry layout row sizing - height constraint</title>
+  <title>CSS Grid Test: Masonry layout row auto-fill sizing</title>
   <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
   <link rel="help" href="https://drafts.csswg.org/css-grid-3/#track-sizing">
   <link rel="match" href="masonry-intrinsic-sizing-006-ref.html">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/support/masonry-intrinsic-sizing-visual.css b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/support/masonry-intrinsic-sizing-visual.css
index dbb6303..150f0f26 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/support/masonry-intrinsic-sizing-visual.css
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/support/masonry-intrinsic-sizing-visual.css
@@ -1,8 +1,9 @@
 /* Basic Testing Setup */
 html,body {
-  color: black; background: white; font: 15px/1 Ahem;
+  color: black; background: white; font: 15px/1 Ahem, monospace;
   padding: 1em 0; margin: 0;
-  height: calc(600px - 2em); border-bottom: 1px solid orange; /* Do Not Cross */
+  max-width: 800px; height: calc(600px - 2em);
+  border-bottom: 1px solid orange; /* Do Not Cross */
 }
 
 
@@ -42,6 +43,6 @@
 grid:hover::after {
   content: attr(title);
   position: absolute;
-  inset: 0.1em 0.5rem;
+  inset: 0.1em auto auto 0.5rem;
   font: bold smaller sans-serif;
 }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/3d-transform-incoming.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/3d-transform-incoming.html
index 983ba1d..4b1411f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/3d-transform-incoming.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/3d-transform-incoming.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="3d-transform-incoming-ref.html">
-<meta name=fuzzy content="3d-transform-incoming-ref.html:0-255;0-515">
+<meta name=fuzzy content="maxDifference=0-255; totalPixels=0-515">
 <script src="/common/reftest-wait.js"></script>
 <style>
 div { box-sizing: border-box; will-change: transform }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/3d-transform-outgoing.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/3d-transform-outgoing.html
index 398fa97..2fe4887b 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/3d-transform-outgoing.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/3d-transform-outgoing.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="3d-transform-outgoing-ref.html">
-<meta name=fuzzy content="3d-transform-outgoing-ref.html:0-255;0-1200">
+<meta name=fuzzy content="maxDifference=0-255; totalPixels=0-1200">
 <script src="/common/reftest-wait.js"></script>
 
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/block-with-overflowing-text.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/block-with-overflowing-text.html
index b3f8f42..15d1653 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/block-with-overflowing-text.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/block-with-overflowing-text.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="block-with-overflowing-text-ref.html">
-<meta name="fuzzy" content="block-with-overflowing-text-ref.html:maxDifference=0-2;totalPixels=0-1200">
+<meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-1200">
 
 
 <script src="/common/reftest-wait.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/break-inside-avoid-child.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/break-inside-avoid-child.html
index 7b2a83c..87d56d3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/break-inside-avoid-child.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/break-inside-avoid-child.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="break-inside-avoid-child-ref.html">
-<meta name="fuzzy" content="break-inside-avoid-child-ref.html:0-5;0-1600">
+<meta name="fuzzy" content="maxDifference=0-5; totalPixels=0-1600">
 <script src="/common/reftest-wait.js"></script>
 
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-offscreen-child.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-offscreen-child.html
index 8588968..7f8085ca 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-offscreen-child.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-offscreen-child.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="capture-with-offscreen-child-ref.html">
-<meta name="fuzzy" content="capture-with-offscreen-child-ref.html:0-5;0-200">
+<meta name="fuzzy" content="maxDifference=0-5; totalPixels=0-200">
 <script src="/common/reftest-wait.js"></script>
 
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-opacity-zero-child.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-opacity-zero-child.html
index 888d0d17..2b0563e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-opacity-zero-child.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-opacity-zero-child.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="capture-with-visibility-hidden-child-ref.html">
-<meta name="fuzzy" content="capture-with-visibility-hidden-child-ref.html:0-5;0-300">
+<meta name="fuzzy" content="maxDifference=0-5; totalPixels=0-300">
 <script src="/common/reftest-wait.js"></script>
 
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-visibility-mixed-descendants.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-visibility-mixed-descendants.html
index 462d267..3a4811ad 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-visibility-mixed-descendants.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/capture-with-visibility-mixed-descendants.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="capture-with-visibility-mixed-descendants-ref.html">
-<meta name=fuzzy content="capture-with-visibility-mixed-descendants-ref.html:0-5;0-500">
+<meta name=fuzzy content="maxDifference=0-5; totalPixels=0-500">
 <script src="/common/reftest-wait.js"></script>
 
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html
index 4cde9cb..4a26c50 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="clip-path-larger-than-border-box-on-child-of-named-element-ref.html">
-<meta name="fuzzy" content="clip-path-larger-than-border-box-on-child-of-named-element-ref.html:maxDifference=0-255;totalPixels=0-400">
+<meta name="fuzzy" content="maxDifference=0-255;totalPixels=0-400">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .target {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/content-with-transform-new-image.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/content-with-transform-new-image.html
index f86f648..a6c4449 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/content-with-transform-new-image.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/content-with-transform-new-image.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="content-with-transform-ref.html">
-<meta name="fuzzy" content="content-with-transform-ref.html:0-1;0-500">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-500">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/content-with-transform-old-image.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/content-with-transform-old-image.html
index 3755910..c6fda7f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/content-with-transform-old-image.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/content-with-transform-old-image.html
@@ -5,7 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="content-with-transform-ref.html">
-<meta name="fuzzy" content="content-with-transform-ref.html:0-1;0-400">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-400">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/css-tags-paint-order-with-entry.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/css-tags-paint-order-with-entry.html
index 2ba7375..c8d92ed 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/css-tags-paint-order-with-entry.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/css-tags-paint-order-with-entry.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="css-tags-paint-order-with-entry-ref.html">
-<meta name="fuzzy" content="css-tags-paint-order-with-entry-ref.html:0-120;0-300">
+<meta name="fuzzy" content="maxDifference=0-120; totalPixels=0-300">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/dialog-in-rtl-iframe.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/dialog-in-rtl-iframe.html
index f5959bf..05bc98d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/dialog-in-rtl-iframe.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/dialog-in-rtl-iframe.html
@@ -5,7 +5,7 @@
   <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
   <link rel="author" href="mailto:bokan@chromium.org">
   <link rel="match" href="dialog-in-rtl-iframe-ref.html">
-  <meta name=fuzzy content="dialog-in-rtl-iframe-ref.html:0-80;0-500">
+  <meta name=fuzzy content="maxDifference=0-80; totalPixels=0-500">
   <script src="/common/reftest-wait.js"></script>
   <style>
     iframe {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/far-away-capture.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/far-away-capture.html
index 97ad9dfb..9ac16216 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/far-away-capture.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/far-away-capture.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="far-away-capture-ref.html">
-<meta name="fuzzy" content="far-away-capture-ref.html:0-1;0-5">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-5">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .flex {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-box-with-overflow-children-new.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-box-with-overflow-children-new.html
index e50e665..14371ac 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-box-with-overflow-children-new.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-box-with-overflow-children-new.html
@@ -6,7 +6,7 @@
 <link rel="match" href="fractional-box-with-overflow-children-ref.html">
 <!-- subpixel differences are ok in this test (in highdpi), but channel difference
      should not be perceptible -->
-<meta name=fuzzy content="fractional-box-with-overflow-children-ref.html:0-3;0-100">
+<meta name=fuzzy content="maxDifference=0-3; totalPixels=0-100">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-box-with-overflow-children-old.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-box-with-overflow-children-old.html
index acf72e2..0d19bf9 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-box-with-overflow-children-old.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fractional-box-with-overflow-children-old.html
@@ -6,7 +6,7 @@
 <link rel="match" href="fractional-box-with-overflow-children-ref.html">
 <!-- subpixel differences are ok in this test (in highdpi), but channel difference
      should not be perceptible -->
-<meta name=fuzzy content="fractional-box-with-overflow-children-ref.html:0-3;0-100">
+<meta name=fuzzy content="maxDifference=0-3; totalPixels=0-100">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-new-has-scrollbar.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-new-has-scrollbar.html
index 67a57bb..81072ac 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-new-has-scrollbar.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-new-has-scrollbar.html
@@ -5,7 +5,7 @@
   <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
   <link rel="author" href="mailto:bokan@chromium.org">
   <link rel="match" href="iframe-new-has-scrollbar-ref.html">
-  <meta name=fuzzy content="iframe-new-has-scrollbar-ref.html:0-80;0-500">
+  <meta name=fuzzy content="maxDifference=0-80; totalPixels=0-500">
   <script src="/common/reftest-wait.js"></script>
   <style>
     iframe {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-old-has-scrollbar.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-old-has-scrollbar.html
index 96dd75a..5d266333 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-old-has-scrollbar.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-old-has-scrollbar.html
@@ -5,7 +5,7 @@
   <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
   <link rel="author" href="mailto:bokan@chromium.org">
   <link rel="match" href="iframe-old-has-scrollbar-ref.html">
-  <meta name=fuzzy content="iframe-old-has-scrollbar-ref.html:0-80;0-500">
+  <meta name=fuzzy content="maxDifference=0-80; totalPixels=0-500">
   <script src="/common/reftest-wait.js"></script>
   <style>
     iframe {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-transition.sub.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-transition.sub.html
index 8fa361b0..5f26a49 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-transition.sub.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/iframe-transition.sub.html
@@ -6,7 +6,7 @@
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="iframe-transition-ref.html">
 <meta name="assert" content="Ensure that iframe root capture is sized and displayed correctly">
-<meta name=fuzzy content="iframe-transition-ref.html:0-200;0-200">
+<meta name=fuzzy content="maxDifference=0-200; totalPixels=0-200">
 <script src="/common/reftest-wait.js"></script>
 <style>
 iframe { width: 500px; height: 500px }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/inline-with-offset-from-containing-block.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/inline-with-offset-from-containing-block.html
index 8640899..026ecb24 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/inline-with-offset-from-containing-block.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/inline-with-offset-from-containing-block.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="inline-with-offset-from-containing-block-ref.html">
-<meta name="fuzzy" content="inline-with-offset-from-containing-block-ref.html:0-255;0-1400">
+<meta name="fuzzy" content="maxDifference=0-255; totalPixels=0-1400">
 
 <script src="/common/reftest-wait.js"></script>
 <script src="/common/rendering-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html
index 23f5fc22..65b14a6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-below-and-on-top-of-viewport-partially-onscreen-ref.html">
-<meta name="fuzzy" content="massive-element-below-and-on-top-of-viewport-partially-onscreen-ref.html:maxDifference=0-2;totalPixels=0-330">
+<meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-330">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-new.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-new.html
index 611d4da..a122cd4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-new.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-new.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-below-viewport-offscreen-ref.html">
-<meta name="fuzzy" content="massive-element-below-viewport-offscreen-ref.html:maxDifference=0-3;totalPixels=0-950">
+<meta name="fuzzy" content="maxDifference=0-3;totalPixels=0-950">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-old.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-old.html
index bda3ebf1..567819fa 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-old.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-old.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-below-viewport-offscreen-ref.html">
-<meta name="fuzzy" content="massive-element-below-viewport-offscreen-ref.html:maxDifference=0-2;totalPixels=0-445">
+<meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-445">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html
index e881e19..42f9755 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-below-viewport-partially-onscreen-ref.html">
-<meta name="fuzzy" content="massive-element-below-viewport-partially-onscreen-ref.html:maxDifference=0-2;totalPixels=0-330">
+<meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-330">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-new.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-new.html
index c8471032a..97a3cb4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-new.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-new.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-left-of-viewport-offscreen-ref.html">
-<meta name="fuzzy" content="massive-element-left-of-viewport-offscreen-ref.html:maxDifference=0-2;totalPixels=0-330">
+<meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-330">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-old.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-old.html
index 04ab58f3a..a41a738 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-old.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-old.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-left-of-viewport-offscreen-ref.html">
-<meta name="fuzzy" content="massive-element-left-of-viewport-offscreen-ref.html:maxDifference=0-3;totalPixels=0-330">
+<meta name="fuzzy" content="maxDifference=0-3;totalPixels=0-330">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-new.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-new.html
index 15cc94f..accd909 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-new.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-new.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-left-of-viewport-partially-onscreen-ref.html">
-<meta name="fuzzy" content="massive-element-left-of-viewport-partially-onscreen-ref.html:maxDifference=0-2;totalPixels=0-330">
+<meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-330">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-old.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-old.html
index 0d2aeec5..e16806e8 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-old.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-old.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-left-of-viewport-partially-onscreen-ref.html">
-<meta name="fuzzy" content="massive-element-left-of-viewport-partially-onscreen-ref.html:maxDifference=0-3;totalPixels=0-330">
+<meta name="fuzzy" content="maxDifference=0-3;totalPixels=0-330">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-new.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-new.html
index 6ef8edd..24edbc1ec 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-new.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-new.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-on-top-of-viewport-offscreen-ref.html">
-<meta name="fuzzy" content="massive-element-on-top-of-viewport-offscreen-ref.html:maxDifference=0-6;totalPixels=0-920">
+<meta name="fuzzy" content="maxDifference=0-6;totalPixels=0-920">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-old.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-old.html
index 5e303e8..8dfc8eef 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-old.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-old.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-on-top-of-viewport-offscreen-ref.html">
-<meta name="fuzzy" content="massive-element-on-top-of-viewport-offscreen-ref.html:maxDifference=0-3;totalPixels=0-330">
+<meta name="fuzzy" content="maxDifference=0-3;totalPixels=0-330">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-new.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-new.html
index a9e5f58..c301e47 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-new.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-new.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-on-top-of-viewport-partially-onscreen-ref.html">
-<meta name="fuzzy" content="massive-element-on-top-of-viewport-partially-onscreen-ref.html:maxDifference=0-2;totalPixels=0-330">
+<meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-330">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-old.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-old.html
index 41dc622..1f810af 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-old.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-old.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-on-top-of-viewport-partially-onscreen-ref.html">
-<meta name="fuzzy" content="massive-element-on-top-of-viewport-partially-onscreen-ref.html:maxDifference=0-3;totalPixels=0-330">
+<meta name="fuzzy" content="maxDifference=0-3;totalPixels=0-330">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-new.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-new.html
index 719701f..426751d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-new.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-new.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-right-and-left-of-viewport-partially-onscreen-ref.html">
-<meta name="fuzzy" content="massive-element-right-and-left-of-viewport-partially-onscreen-ref.html:maxDifference=0-2;totalPixels=0-330">
+<meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-330">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-new.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-new.html
index 89d00a5..53749f29 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-new.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-new.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-right-of-viewport-offscreen-ref.html">
-<meta name="fuzzy" content="massive-element-right-of-viewport-offscreen-ref.html:maxDifference=0-2;totalPixels=0-445">
+<meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-445">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-old.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-old.html
index 04247af1..b5337c4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-old.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-old.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-right-of-viewport-offscreen-ref.html">
-<meta name="fuzzy" content="massive-element-right-of-viewport-offscreen-ref.html:maxDifference=0-3;totalPixels=0-445">
+<meta name="fuzzy" content="maxDifference=0-3;totalPixels=0-445">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-new.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-new.html
index a7b599e5..ac3fe48a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-new.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-new.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-right-of-viewport-partially-onscreen-ref.html">
-<meta name="fuzzy" content="massive-element-right-of-viewport-partially-onscreen-ref.html:maxDifference=0-2;totalPixels=0-330">
+<meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-330">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-old.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-old.html
index 2498f2e..2626910 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-old.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-old.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="massive-element-right-of-viewport-partially-onscreen-ref.html">
-<meta name="fuzzy" content="massive-element-right-of-viewport-partially-onscreen-ref.html:maxDifference=0-3;totalPixels=0-445">
+<meta name="fuzzy" content="maxDifference=0-3;totalPixels=0-445">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/multiline-span-with-overflowing-text-and-box-decorations.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/multiline-span-with-overflowing-text-and-box-decorations.html
index e166b3c..8fff184 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/multiline-span-with-overflowing-text-and-box-decorations.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/multiline-span-with-overflowing-text-and-box-decorations.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="multiline-span-with-overflowing-text-and-box-decorations-ref.html">
-<meta name="fuzzy" content="multiline-span-with-overflowing-text-and-box-decorations-ref.html:maxDifference=0-3;totalPixels=0-4900">
+<meta name="fuzzy" content="maxDifference=0-3; totalPixels=0-4900">
 
 
 <script src="/common/reftest-wait.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-and-old-sizes-match.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-and-old-sizes-match.html
index 094d696..70b6515 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-and-old-sizes-match.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-and-old-sizes-match.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="new-and-old-sizes-match-ref.html">
-<meta name="fuzzy" content="new-and-old-sizes-match-ref.html:0-1;0-300">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-300">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-captures-clip-path.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-captures-clip-path.html
index 702bb09..19af249 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-captures-clip-path.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-captures-clip-path.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="new-content-captures-clip-path-ref.html">
-<meta name="fuzzy" content="new-content-captures-clip-path-ref.html:0-1;0-500">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-500">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-captures-different-size.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-captures-different-size.html
index 7401996..18f323c 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-captures-different-size.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-captures-different-size.html
@@ -5,7 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="new-content-captures-different-size-ref.html">
-<meta name=fuzzy content="new-content-captures-different-size-ref.html:0-40;0-30000">
+<meta name=fuzzy content="maxDifference=0-40; totalPixels=0-30000">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-has-scrollbars.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-has-scrollbars.html
index 3246a7e..834d0e8f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-has-scrollbars.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-has-scrollbars.html
@@ -6,7 +6,7 @@
 <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7859">
 <link rel="author" href="mailto:bokan@chromium.org">
 <link rel="match" href="new-content-has-scrollbars-ref.html">
-<meta name=fuzzy content="new-content-has-scrollbars-ref.html:0-40;0-30000">
+<meta name=fuzzy content="maxDifference=0-40; totalPixels=0-30000">
 <script src="/common/reftest-wait.js"></script>
 <style>
   html, body {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-is-inline.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-is-inline.html
index 46c96acb..81b261a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-is-inline.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-is-inline.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/">
 <link rel="author" href="mailto:bokan@chromium.org">
 <link rel="match" href="new-content-is-inline-ref.html">
-<meta name="fuzzy" content="new-content-is-inline-ref.html:0-255;0-1000">
+<meta name="fuzzy" content="maxDifference=0-255; totalPixels=0-1000">
 <script src="/common/reftest-wait.js"></script>
 
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-object-fit-fill.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-object-fit-fill.html
index 04a8040..a610d688 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-object-fit-fill.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-object-fit-fill.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="content-object-fit-fill-ref.html">
-<meta name="fuzzy" content="content-object-fit-fill-ref.html:0-60;0-20">
+<meta name="fuzzy" content="maxDifference=0-60; totalPixels=0-20">
 <script src="/common/reftest-wait.js"></script>
 <style>
 #target {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-scaling.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-scaling.html
index bccb760..376b7fd 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-scaling.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/new-content-scaling.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="new-content-scaling-ref.html">
-<meta name="fuzzy" content="new-content-scaling-ref.html:maxDifference=0-16;totalPixels=0-400">
+<meta name="fuzzy" content="maxDifference=0-16; totalPixels=0-400">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .shared {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/object-view-box-old-image.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/object-view-box-old-image.html
index 335e48fa..793dfd4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/object-view-box-old-image.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/object-view-box-old-image.html
@@ -5,7 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="object-view-box-ref.html">
-<meta name="fuzzy" content="object-view-box-ref.html:0-1;0-300">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-300">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-clip-path.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-clip-path.html
index 7ed5e1c..67aa5bf3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-clip-path.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-clip-path.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-captures-clip-path-ref.html">
-<meta name="fuzzy" content="old-content-captures-clip-path-ref.html:0-1;0-500">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-500">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-different-size.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-different-size.html
index 392247b..7f3be74 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-different-size.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-different-size.html
@@ -5,7 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-captures-different-size-ref.html">
-<meta name=fuzzy content="old-content-captures-different-size-ref.html:0-40;0-30000">
+<meta name=fuzzy content="maxDifference=0-40; totalPixels=0-30000">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-opacity.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-opacity.html
index cd71c9d..97b8911 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-opacity.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-opacity.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-captures-opacity-ref.html">
-<meta name=fuzzy content="old-content-captures-opacity-ref.html:0-1;0-50000">
+<meta name=fuzzy content="maxDifference=0-1; totalPixels=0-50000">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-root.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-root.html
index 51a22bc..a1cb3329 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-root.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-captures-root.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-captures-root-ref.html">
-<meta name="fuzzy" content="old-content-captures-root-ref.html:0-1;0-500">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-500">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .box {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-has-scrollbars.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-has-scrollbars.html
index 13e26c7..b9638ebb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-has-scrollbars.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-has-scrollbars.html
@@ -6,7 +6,7 @@
 <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7859">
 <link rel="author" href="mailto:bokan@chromium.org">
 <link rel="match" href="old-content-has-scrollbars-ref.html">
-<meta name=fuzzy content="old-content-has-scrollbars-ref.html:0-40;0-30000">
+<meta name=fuzzy content="maxDifference=0-40; totalPixels=0-30000">
 <script src="/common/reftest-wait.js"></script>
 <style>
   html, body {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-is-inline.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-is-inline.html
index 70ff67c..3333a07a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-is-inline.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-is-inline.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/">
 <link rel="author" href="mailto:bokan@chromium.org">
 <link rel="match" href="old-content-is-inline-ref.html">
-<meta name="fuzzy" content="old-content-is-inline-ref.html:0-255;0-500">
+<meta name="fuzzy" content="maxDifference=0-255; totalPixels=0-500">
 <script src="/common/reftest-wait.js"></script>
 
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-fit-fill.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-fit-fill.html
index 0652b30a0..51023fa 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-fit-fill.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-fit-fill.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="content-object-fit-fill-ref.html">
-<meta name="fuzzy" content="content-object-fit-fill-ref.html:0-60;0-20">
+<meta name="fuzzy" content="maxDifference=0-60; totalPixels=0-20">
 <script src="/common/reftest-wait.js"></script>
 <style>
 #target {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-view-box-clip-path-reference.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-view-box-clip-path-reference.html
index 5e6969d..827ca02 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-view-box-clip-path-reference.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-view-box-clip-path-reference.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-object-view-box-clip-path-reference-ref.html">
-<meta name="fuzzy" content="old-content-object-view-box-clip-path-reference-ref.html:0-1;0-100">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-100">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .target {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-view-box-clip-path.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-view-box-clip-path.html
index f8945551..d0d26b97 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-view-box-clip-path.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/old-content-object-view-box-clip-path.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-object-view-box-clip-path-ref.html">
-<meta name="fuzzy" content="old-content-object-view-box-clip-path-ref.html:0-1;0-30">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-30">
 <script src="/common/reftest-wait.js"></script>
 <style>
 .target {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/pseudo-rendering-invalidation.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/pseudo-rendering-invalidation.html
index e1f17186..4d492c40 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/pseudo-rendering-invalidation.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/pseudo-rendering-invalidation.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:bokan@chromium.org">
 <link rel="match" href="pseudo-rendering-invalidation-ref.html">
-<meta name="fuzzy" content="pseudo-rendering-invalidation-ref.html:0-20;0-300">
+<meta name="fuzzy" content="maxDifference=0-20; totalPixels=0-300">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/root-captured-as-different-tag.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/root-captured-as-different-tag.html
index a4d6f11a..1d4d161 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/root-captured-as-different-tag.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/root-captured-as-different-tag.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="old-content-captures-root-ref.html">
-<meta name="fuzzy" content="old-content-captures-root-ref.html:0-1;0-500">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-500">
 <script src="/common/reftest-wait.js"></script>
 <style>
 :root { view-transition-name: another-root; }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller-child-abspos.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller-child-abspos.html
index 3b94ffa..d04f8721 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller-child-abspos.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller-child-abspos.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="scroller-child-abspos-ref.html">
-<meta name="fuzzy" content="scroller-child-abspos-ref.html:0-5;0-800">
+<meta name="fuzzy" content="maxDifference=0-5; totalPixels=0-800">
 <script src="/common/reftest-wait.js"></script>
 
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller-child.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller-child.html
index 5cb2f03e..7d4368f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller-child.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller-child.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="scroller-child-ref.html">
-<meta name="fuzzy" content="scroller-child-ref.html:0-5;0-800">
+<meta name="fuzzy" content="maxDifference=0-5; totalPixels=0-800">
 <script src="/common/reftest-wait.js"></script>
 
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller.html
index e61d13b3..9d82046 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scroller.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="scroller-ref.html">
-<meta name="fuzzy" content="scroller-ref.html:0-5;0-10">
+<meta name="fuzzy" content="maxDifference=0-5; totalPixels=0-10">
 <script src="/common/reftest-wait.js"></script>
 
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/set-current-time.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/set-current-time.html
index f7e802d7..efe561c6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/set-current-time.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/set-current-time.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/">
 <link rel="author" href="mailto:vmpstr@chromium.org">
 <link rel="match" href="set-current-time-ref.html">
-<meta name="fuzzy" content="set-current-time-ref.html:0-2;0-40000">
+<meta name="fuzzy" content="maxDifference=0-2; totalPixels=0-40000">
 <script src="/common/reftest-wait.js"></script>
 <style>
 :root { view-transition-name: unset; }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-absolute.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-absolute.html
index 4a619f29..91b71f7 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-absolute.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-absolute.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:bokan@chromium.org">
 <link rel="match" href="snapshot-containing-block-absolute-ref.html">
-<meta name="fuzzy" content="snapshot-containing-block-absolute-ref.html:0-20;0-100">
+<meta name="fuzzy" content="maxDifference=0-20; totalPixels=0-100">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-includes-scrollbar-gutter.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-includes-scrollbar-gutter.html
index 8e47a05..40feea4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-includes-scrollbar-gutter.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-includes-scrollbar-gutter.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:bokan@chromium.org">
 <link rel="match" href="snapshot-containing-block-includes-scrollbar-gutter-ref.html">
-<meta name="fuzzy" content="snapshot-containing-block-includes-scrollbar-gutter-ref.html:0-20;0-100">
+<meta name="fuzzy" content="maxDifference=0-20; totalPixels=0-100">
 <script src="/common/reftest-wait.js"></script>
 <style>
   :root {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-static.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-static.html
index fc0c703..44fe4cf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-static.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/snapshot-containing-block-static.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:bokan@chromium.org">
 <link rel="match" href="snapshot-containing-block-static-ref.html">
-<meta name="fuzzy" content="snapshot-containing-block-static-ref.html:0-20;0-100">
+<meta name="fuzzy" content="maxDifference=0-20; totalPixels=0-100">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html
index a2bf59ec..262970a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html
@@ -4,8 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="span-with-overflowing-text-and-box-decorations-ref.html">
-<meta name="fuzzy" content="span-with-overflowing-text-and-box-decorations-ref.html:maxDifference=0-3;totalPixels=0-4900">
-
+<meta name="fuzzy" content="maxDifference=0-3;totalPixels=0-4900">
 
 <script src="/common/reftest-wait.js"></script>
 <script src="/common/rendering-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/span-with-overflowing-text.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/span-with-overflowing-text.html
index f3f0f53..5a6268d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/span-with-overflowing-text.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/span-with-overflowing-text.html
@@ -4,8 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="span-with-overflowing-text-ref.html">
-<meta name="fuzzy" content="span-with-overflowing-text-ref.html:maxDifference=0-3;totalPixels=0-1100">
-
+<meta name="fuzzy" content="maxDifference=0-3;totalPixels=0-1100">
 
 <script src="/common/reftest-wait.js"></script>
 <script src="/common/rendering-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/transition-in-empty-iframe.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/transition-in-empty-iframe.html
index 7cd621f..101f7c2 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/transition-in-empty-iframe.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/transition-in-empty-iframe.html
@@ -5,7 +5,7 @@
   <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
   <link rel="author" href="mailto:bokan@chromium.org">
   <link rel="match" href="transition-in-empty-iframe-ref.html">
-  <meta name=fuzzy content="transition-in-empty-iframe-ref.html:0-80;0-1000">
+  <meta name=fuzzy content="maxDifference=0-80; totalPixels=0-1000">
   <script src="/common/reftest-wait.js"></script>
   <style>
     iframe {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html
index 40c9a0d..dfaac62c 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html
@@ -3,7 +3,7 @@
 <title>View transitions with web-animation API: full parsing of argument</title>
 <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/">
 <link rel="match" href="web-animations-api-ref.html">
-<meta name="fuzzy" content="web-animations-api-ref.html:0-2;0-500">
+<meta name="fuzzy" content="maxDifference=0-2; totalPixels=0-500">
 <meta name="variant" content="?first-pseudo=::view-transition-group( first)">
 <meta name="variant" content="?first-pseudo=::view-transition-group(first)">
 <meta name="variant" content="?first-pseudo=::view-transition-group( first">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/web-animations-api.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/web-animations-api.html
index c739e41..23b1504b 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/web-animations-api.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/web-animations-api.html
@@ -4,7 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
 <link rel="author" href="mailto:khushalsagar@chromium.org">
 <link rel="match" href="web-animations-api-ref.html">
-<meta name="fuzzy" content="web-animations-api-ref.html:0-2;0-500">
+<meta name="fuzzy" content="maxDifference=0-2; totalPixels=0-500">
 
 <script src="/common/reftest-wait.js"></script>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-change-display.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-change-display.tentative.html
index 435929a..4312a15 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-change-display.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-change-display.tentative.html
@@ -42,6 +42,7 @@
     background: orange;
   }
   [popover] {
+    inset: auto;
     background: lime;
     padding:0;
     border:0;
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-display-none.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-display-none.tentative.html
index 55a11faf..8db022b 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-display-none.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-display-none.tentative.html
@@ -15,6 +15,7 @@
     display: none;
   }
   [popover] {
+    inset: auto;
     background: lime;
     padding: 0;
     border: 0;
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-display.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-display.tentative.html
index bddc440..a713540 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-display.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-display.tentative.html
@@ -61,6 +61,7 @@
     background: orange;
   }
   [popover] {
+    inset: auto;
     background: lime;
     padding:0;
     border:0;
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-scroll-display.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-scroll-display.tentative.html
index 2c6b0ba..a301032 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-scroll-display.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-scroll-display.tentative.html
@@ -40,6 +40,7 @@
     background: orange;
   }
   [popover] {
+    inset: auto;
     background: lime;
     padding:0;
     border:0;
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-transition.tentative.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-transition.tentative.tentative.html
index ae2a3a8..f6220f3 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-transition.tentative.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-transition.tentative.tentative.html
@@ -13,6 +13,7 @@
 }
 
 #target {
+  inset: auto;
   transition: display 2s;
 }
 </style>
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py
index ecd3173e..52aabca 100644
--- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py
+++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py
@@ -46,10 +46,36 @@
         )
 
 
+@pytest.mark.parametrize("type", ["css", "xpath", "innerText"])
+@pytest.mark.parametrize("value", [None, False, 42, {}, []])
+async def test_params_locator_value_invalid_type(
+    bidi_session, inline, top_context, type, value
+):
+    await navigate_to_page(bidi_session, inline, top_context)
+
+    with pytest.raises(error.InvalidArgumentException):
+        await bidi_session.browsing_context.locate_nodes(
+            context=top_context["context"], locator={"type": type, "value": value}
+        )
+
+
+@pytest.mark.parametrize("value", [None, False, 42, {}, []])
+async def test_params_locator_accessability_value_invalid_type(
+    bidi_session, inline, top_context, value
+):
+    await navigate_to_page(bidi_session, inline, top_context)
+
+    with pytest.raises(error.InvalidArgumentException):
+        await bidi_session.browsing_context.locate_nodes(
+            context=top_context["context"], locator={"type": "accessability", "value": value}
+        )
+
+
 @pytest.mark.parametrize("type,value", [
     ("css", "a*b"),
     ("xpath", ""),
-    ("innerText", "")
+    ("innerText", ""),
+    ("accessibility", {})
 ])
 async def test_params_locator_value_invalid_value(bidi_session, inline, top_context, type, value):
     await navigate_to_page(bidi_session, inline, top_context)
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/locator.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/locator.py
index e560fa92..66c512d 100644
--- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/locator.py
+++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/locator.py
@@ -6,11 +6,17 @@
 @pytest.mark.parametrize("type,value", [
     ("css", "div"),
     ("xpath", "//div"),
-    ("innerText", "foobarBARbaz")
+    ("innerText", "foobarBARbaz"),
+    ("accessibility", {"role": "banner"}),
+    ("accessibility", {"name": "foo"}),
+    ("accessibility", {"role": "banner", "name": "foo"}),
 ])
 @pytest.mark.asyncio
 async def test_find_by_locator(bidi_session, inline, top_context, type, value):
-    url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""")
+    url = inline("""
+        <div data-class="one" role="banner" aria-label="foo">foobarBARbaz</div>
+        <div data-class="two" role="banner" aria-label="foo">foobarBARbaz</div>
+    """)
     await bidi_session.browsing_context.navigate(
         context=top_context["context"], url=url, wait="complete"
     )
@@ -165,3 +171,69 @@
     )
 
     recursive_compare(expected, result["nodes"])
+
+
+@pytest.mark.parametrize(
+    "html,locator_value,expected_node_local_name",
+    [
+        (
+            "<article data-class='one'>foo</article><div data-class='two'>bar</div>",
+            {"role": "article"},
+            "article",
+        ),
+        (
+            "<input role='searchbox' data-class='one' /><input data-class='two' type='text'/>",
+            {"role": "searchbox"},
+            "input",
+        ),
+        (
+            "<button data-class='one'>Ok</button><button data-class='two'>Cancel</button>",
+            {"name": "Ok"},
+            "button",
+        ),
+        (
+            "<button data-class='one' aria-labelledby='one two'></button><div id='one'>ok</div><div id='two'>go</div><button data-class='two'>Cancel</button>",
+            {"name": "ok go"},
+            "button",
+        ),
+        (
+            "<button data-class='one' aria-label='foo'>bar</button><button data-class='two' aria-label='bar'>foo</button>",
+            {"name": "foo"},
+            "button",
+        ),
+        (
+            "<div role='banner' aria-label='foo' data-class='one'></div><div role='banner'  data-class='two'></div><div aria-label='foo' data-class='three'></div>",
+            {"role": "banner", "name": "foo"},
+            "div",
+        ),
+    ],
+)
+@pytest.mark.asyncio
+async def test_locate_by_accessibility_attributes(
+    bidi_session,
+    inline,
+    top_context,
+    html,
+    locator_value,
+    expected_node_local_name,
+):
+    await bidi_session.browsing_context.navigate(
+        context=top_context["context"], url=inline(html), wait="complete"
+    )
+
+    expected = [
+        {
+            "type": "node",
+            "value": {
+                "attributes": {"data-class": "one"},
+                "localName": expected_node_local_name,
+            },
+        }
+    ]
+
+    result = await bidi_session.browsing_context.locate_nodes(
+        context=top_context["context"],
+        locator={"type": "accessibility", "value": locator_value},
+    )
+
+    recursive_compare(expected, result["nodes"])
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/max_node_count.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/max_node_count.py
index 4652026..9d9c052 100644
--- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/max_node_count.py
+++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/max_node_count.py
@@ -43,6 +43,45 @@
             },
         }]
     ),
+    ("accessibility", {"role": "banner"}, 1, [
+        {
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"one"},
+                "childNodeCount": 1,
+                "localName": "div",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            },
+        }]
+    ),
+    ("accessibility", {"name": "bar"}, 1, [
+        {
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"one"},
+                "childNodeCount": 1,
+                "localName": "div",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            },
+        }]
+    ),
+    ("accessibility", {"role": "banner", "name": "bar"}, 1, [
+        {
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"one"},
+                "childNodeCount": 1,
+                "localName": "div",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            },
+        }]
+    ),
     ("css", "div", 10, [
         {
             "type": "node",
@@ -114,18 +153,96 @@
                 "nodeType": 1,
             },
         }]
-    )
+    ),
+    ("accessibility", {"role": "banner"}, 10, [
+        {
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"one"},
+                "childNodeCount": 1,
+                "localName": "div",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            },
+        }, {
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"two"},
+                "childNodeCount": 1,
+                "localName": "div",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            },
+        }]
+    ),
+    ("accessibility", {"name": "bar"}, 10, [
+        {
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"one"},
+                "childNodeCount": 1,
+                "localName": "div",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            },
+        }, {
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"two"},
+                "childNodeCount": 1,
+                "localName": "div",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            },
+        }]
+    ),
+    ("accessibility", {"role": "banner", "name": "bar"}, 10, [
+        {
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"one"},
+                "childNodeCount": 1,
+                "localName": "div",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            },
+        }, {
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"two"},
+                "childNodeCount": 1,
+                "localName": "div",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            },
+        }]
+    ),
 ], ids=[
     "css_single",
     "xpath_single",
     "inner_text_single",
+    "accessibility_role_single",
+    "accessibility_name_single",
+    "accessibility_role_name_single",
     "css_multiple",
     "xpath_multiple",
-    "inner_text_multiple"
+    "inner_text_multiple",
+    "accessibility_role_multiple",
+    "accessibility_name_multiple",
+    "accessibility_role_name_multiple",
 ])
 @pytest.mark.asyncio
 async def test_find_by_locator_limit_return_count(bidi_session, inline, top_context, type, value, max_count, expected):
-    url = inline("""<div data-class="one">foo</div><div data-class="two">foo</div>""")
+    url = inline("""
+        <div data-class="one" role="banner" aria-label="bar">foo</div>
+        <div data-class="two" role="banner" aria-label="bar">foo</div>
+    """)
     await bidi_session.browsing_context.navigate(
         context=top_context["context"], url=url, wait="complete"
     )
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/start_nodes.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/start_nodes.py
index 707d83a..f44a6d4 100644
--- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/start_nodes.py
+++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/start_nodes.py
@@ -92,13 +92,59 @@
                 "namespaceURI": "http://www.w3.org/1999/xhtml",
                 "nodeType": 1,
             }
-    }])
+    }]),
+    ("accessibility", {"role": "banner"}, [{
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"one"},
+                "childNodeCount": 1,
+                "localName": "p",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            }
+        },
+        {
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"two"},
+                "childNodeCount": 1,
+                "localName": "p",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            }
+    }]),
+    ("accessibility", {"name": "bar"}, [{
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"one"},
+                "childNodeCount": 1,
+                "localName": "p",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            }
+        }
+    ]),
+    ("accessibility", {"role": "banner", "name": "bar"}, [{
+            "type": "node",
+            "sharedId": any_string,
+            "value": {
+                "attributes": {"data-class":"one"},
+                "childNodeCount": 1,
+                "localName": "p",
+                "namespaceURI": "http://www.w3.org/1999/xhtml",
+                "nodeType": 1,
+            }
+        }
+    ])
 ])
 @pytest.mark.asyncio
 async def test_locate_with_context_nodes(bidi_session, inline, top_context, type, value, expected):
     url = inline("""<div id="parent">
-        <p data-class="one">foo</p>
-        <p data-class="two">foo</p>
+        <p data-class="one" role="banner" aria-label="bar">foo</p>
+        <p data-class="two" role="banner">foo</p>
         <a data-class="three">
             <span id="text">bar</span>
         </a>
@@ -125,14 +171,23 @@
 @pytest.mark.parametrize("type,value", [
     ("css", "p[data-class='one']"),
     ("xpath", ".//p[@data-class='one']"),
-    ("innerText", "foo")
+    ("innerText", "foo"),
+    ("accessibility", {"role": "banner"}),
+    ("accessibility", {"name": "bar"}),
+    ("accessibility", {"role": "banner", "name": "bar"}),
 ])
 @pytest.mark.asyncio
 async def test_locate_with_multiple_context_nodes(bidi_session, inline, top_context, type, value):
     url = inline("""
-                 <div id="parent-one"><p data-class="one">foo</p><p data-class="two">bar</p></div>
-                 <div id="parent-two"><p data-class="one">foo</p><p data-class="two">bar</p></div>
-                 """)
+        <div id="parent-one">
+            <p data-class="one" role="banner" aria-label="bar">foo</p>
+            <p data-class="two">bar</p>
+        </div>
+        <div id="parent-two">
+            <p data-class="one" role="banner" aria-label="bar">foo</p>
+            <p data-class="two">bar</p>
+        </div>
+    """)
     await bidi_session.browsing_context.navigate(
         context=top_context["context"], url=url, wait="complete"
     )
diff --git a/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/invalid-expected.txt b/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/invalid-expected.txt
new file mode 100644
index 0000000..cac1aac
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/invalid-expected.txt
@@ -0,0 +1,4 @@
+This is a wdspec test.
+[FAIL] test_params_locator_value_invalid_value[accessibility-value3]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/locator-expected.txt b/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/locator-expected.txt
new file mode 100644
index 0000000..506b5a7f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/locator-expected.txt
@@ -0,0 +1,20 @@
+This is a wdspec test.
+[FAIL] test_find_by_locator[accessibility-value3]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_find_by_locator[accessibility-value4]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_find_by_locator[accessibility-value5]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_locate_by_accessibility_attributes[<article data-class='one'>foo</article><div data-class='two'>bar</div>-locator_value0-article]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_locate_by_accessibility_attributes[<input role='searchbox' data-class='one' /><input data-class='two' type='text'/>-locator_value1-input]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_locate_by_accessibility_attributes[<button data-class='one'>Ok</button><button data-class='two'>Cancel</button>-locator_value2-button]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_locate_by_accessibility_attributes[<button data-class='one' aria-labelledby='one two'></button><div id='one'>ok</div><div id='two'>go</div><button data-class='two'>Cancel</button>-locator_value3-button]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_locate_by_accessibility_attributes[<button data-class='one' aria-label='foo'>bar</button><button data-class='two' aria-label='bar'>foo</button>-locator_value4-button]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_locate_by_accessibility_attributes[<div role='banner' aria-label='foo' data-class='one'></div><div role='banner'  data-class='two'></div><div aria-label='foo' data-class='three'></div>-locator_value5-div]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/max_node_count-expected.txt b/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/max_node_count-expected.txt
new file mode 100644
index 0000000..a655224
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux-chrome/external/wpt/webdriver/tests/bidi/browsing_context/locate_nodes/max_node_count-expected.txt
@@ -0,0 +1,14 @@
+This is a wdspec test.
+[FAIL] test_find_by_locator_limit_return_count[accessibility_role_single]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_find_by_locator_limit_return_count[accessibility_name_single]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_find_by_locator_limit_return_count[accessibility_role_name_single]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_find_by_locator_limit_return_count[accessibility_role_multiple]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_find_by_locator_limit_return_count[accessibility_name_multiple]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+[FAIL] test_find_by_locator_limit_return_count[accessibility_role_name_multiple]
+  webdriver.bidi.error.InvalidArgumentException: invalid argument (Invalid input in "locator".)
+Harness: the test ran to completion.
diff --git a/third_party/chromium-variations b/third_party/chromium-variations
index 5d2512d..7b0c418 160000
--- a/third_party/chromium-variations
+++ b/third_party/chromium-variations
@@ -1 +1 @@
-Subproject commit 5d2512d77e06e5c6938a49192bbea2bed1618afe
+Subproject commit 7b0c418c18885973e5df7ff3523b911050bf6ae8
diff --git a/third_party/dawn b/third_party/dawn
index e228605..cd07b9f 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit e228605ee7bea07756b742941cfd3aec088311ec
+Subproject commit cd07b9f4050952300ee34b15d84c30a70523e80c
diff --git a/third_party/depot_tools b/third_party/depot_tools
index 4eb81e6..6ba67af 160000
--- a/third_party/depot_tools
+++ b/third_party/depot_tools
@@ -1 +1 @@
-Subproject commit 4eb81e6f13fbf6f9c550d895c7c3e6cfd19d34f7
+Subproject commit 6ba67afd6fb7718743af91b847ddf1907f3ee9a6
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal
index a13168e..cadbad6 160000
--- a/third_party/devtools-frontend-internal
+++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@
-Subproject commit a13168edbd77143405d485f3347663c320223f66
+Subproject commit cadbad6bc7fe48b083e0d25eb6feb06fa7a02d89
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 83ecf63..170f1b6 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 83ecf63b0b905fb835f38389a8130b4b19265387
+Subproject commit 170f1b62ff2ddac12ee66724127335585acc8ece
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index 9162fb0..652d0e0 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-13-2-116-gdbdcd7588
-Revision: dbdcd758895647028bbc56baf862a1cff07409ff
+Version: VER-2-13-2-117-g9a2d6d97b
+Revision: 9a2d6d97b2d8a5d22d02948b783df12b764afa2d
 CPEPrefix: cpe:/a:freetype:freetype:2.13.2
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
diff --git a/third_party/freetype/src b/third_party/freetype/src
index dbdcd75..9a2d6d97 160000
--- a/third_party/freetype/src
+++ b/third_party/freetype/src
@@ -1 +1 @@
-Subproject commit dbdcd758895647028bbc56baf862a1cff07409ff
+Subproject commit 9a2d6d97b2d8a5d22d02948b783df12b764afa2d
diff --git a/third_party/lit/v3_0/BUILD.gn b/third_party/lit/v3_0/BUILD.gn
index 415cd7f..48507f2 100644
--- a/third_party/lit/v3_0/BUILD.gn
+++ b/third_party/lit/v3_0/BUILD.gn
@@ -19,6 +19,7 @@
     # - a few chrome/browser/resources/ folders  that hold small UIs.
     # Update when the migration enters its next phase.
     "//chrome/browser/resources/side_panel/reading_list:build_ts",
+    "//chrome/browser/resources/side_panel/shared:build_ts",
     "//chrome/browser/resources/welcome:build_ts",
     "//chrome/browser/resources/whats_new:build_ts",
     "//chrome/test/data/webui/cr_components:build_ts",
diff --git a/third_party/skia b/third_party/skia
index 6af0f1f..dec629b 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 6af0f1febeca72da6472c388d897e87cb897dbc4
+Subproject commit dec629b762ec426f9062f25157e9640de60d4d50
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index 931022b..71b1153 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit 931022b21e50cacab1d65546c96f9aa8242969f9
+Subproject commit 71b11532ed72adaec5d5e006d92ce741b71379a3
diff --git a/third_party/webgpu-cts/src b/third_party/webgpu-cts/src
index cb9d590..680c654 160000
--- a/third_party/webgpu-cts/src
+++ b/third_party/webgpu-cts/src
@@ -1 +1 @@
-Subproject commit cb9d5903ea1dc93ad4fe3e67652e2f65026fc909
+Subproject commit 680c654441704480e9756124770dd683a32d13d1
diff --git a/third_party/webrtc b/third_party/webrtc
index dc43cb2..0afde76 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit dc43cb24bd8ee85d6a8224c5928ceaf90de729b6
+Subproject commit 0afde7614d1ce398f516f19a032ef94f4c9f1011
diff --git a/tools/binary_size/libsupersize/data_quality.py b/tools/binary_size/libsupersize/data_quality.py
index 64a28aa..e880fe0f 100644
--- a/tools/binary_size/libsupersize/data_quality.py
+++ b/tools/binary_size/libsupersize/data_quality.py
@@ -241,7 +241,7 @@
           # E.g.: Set to 0 and see what warnings appear, then take max value.
           and ((sym.section in 'rd' and sym.padding >= 256) or
                (sym.section in 't' and sym.padding >= 64))):
-        # TODO(crbug.com/959906): We should synthesize symbols for these gaps
+        # TODO(crbug.com/40626114): We should synthesize symbols for these gaps
         #     rather than attribute them as padding.
         spam_counter += 1
         if spam_counter > 5:
diff --git a/tools/code_coverage/js_source_maps/merge_js_source_maps/test/merge_js_source_maps_test.py b/tools/code_coverage/js_source_maps/merge_js_source_maps/test/merge_js_source_maps_test.py
index 2fdfc02c..2ccdb113 100755
--- a/tools/code_coverage/js_source_maps/merge_js_source_maps/test/merge_js_source_maps_test.py
+++ b/tools/code_coverage/js_source_maps/merge_js_source_maps/test/merge_js_source_maps_test.py
@@ -16,8 +16,8 @@
 _HERE_DIR = Path(__file__).parent.resolve()
 _SOURCE_MAP_MERGER = (_HERE_DIR.parent / 'merge_js_source_maps.js').resolve()
 
-# TODO(crbug/1337530): Move common sourcemap build rules and tests into a more
-# generic location.
+# TODO(crbug.com/40229311): Move common sourcemap build rules and tests into a
+# more generic location.
 _SOURCE_MAP_TRANSLATOR = (_HERE_DIR.parent.parent / 'create_js_source_maps' /
                           'test' / 'translate_source_map.js').resolve()
 
diff --git a/tools/disable_tests/tests/expectations-bug-with-message.json b/tools/disable_tests/tests/expectations-bug-with-message.json
index 46033b3..f49b9f25 100644
--- a/tools/disable_tests/tests/expectations-bug-with-message.json
+++ b/tools/disable_tests/tests/expectations-bug-with-message.json
@@ -14,6 +14,6 @@
     "chrome/browser/extensions/calculator_app_browsertest.cc": "// Copyright 2012 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"base/files/file_path.h\"\n#include \"base/path_service.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/common/chrome_paths.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"net/base/filename_util.h\"\n\nclass CalculatorBrowserTest : public InProcessBrowserTest {};\n\nIN_PROC_BROWSER_TEST_F(CalculatorBrowserTest, Model) {\n  base::FilePath test_file;\n  base::PathService::Get(chrome::DIR_TEST_DATA, &test_file);\n  test_file =\n      test_file.AppendASCII(\"extensions/calculator_app/tests/automatic.html\");\n\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(),\n                                           net::FilePathToFileURL(test_file)));\n\n  ASSERT_EQ(true, content::EvalJs(\n                      browser()->tab_strip_model()->GetActiveWebContents(),\n                      \"window.runTests().success\"));\n}\n"
   },
   "written_data": {
-    "chrome/browser/extensions/calculator_app_browsertest.cc": "// Copyright 2012 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"base/files/file_path.h\"\n#include \"base/path_service.h\"\n#include \"build/build_config.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/common/chrome_paths.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"net/base/filename_util.h\"\n\nclass CalculatorBrowserTest : public InProcessBrowserTest {};\n\n// TODO(crbug.com/1492): My Custom Bug Message\n#if BUILDFLAG(IS_LINUX)\n#define MAYBE_Model DISABLED_Model\n#else\n#define MAYBE_Model Model\n#endif\nIN_PROC_BROWSER_TEST_F(CalculatorBrowserTest, MAYBE_Model) {\n  base::FilePath test_file;\n  base::PathService::Get(chrome::DIR_TEST_DATA, &test_file);\n  test_file =\n      test_file.AppendASCII(\"extensions/calculator_app/tests/automatic.html\");\n\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(),\n                                           net::FilePathToFileURL(test_file)));\n\n  ASSERT_EQ(true, content::EvalJs(\n                      browser()->tab_strip_model()->GetActiveWebContents(),\n                      \"window.runTests().success\"));\n}\n"
+    "chrome/browser/extensions/calculator_app_browsertest.cc": "// Copyright 2012 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"base/files/file_path.h\"\n#include \"base/path_service.h\"\n#include \"build/build_config.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/common/chrome_paths.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"net/base/filename_util.h\"\n\nclass CalculatorBrowserTest : public InProcessBrowserTest {};\n\n// TODO(crbug.com/40935977): My Custom Bug Message\n#if BUILDFLAG(IS_LINUX)\n#define MAYBE_Model DISABLED_Model\n#else\n#define MAYBE_Model Model\n#endif\nIN_PROC_BROWSER_TEST_F(CalculatorBrowserTest, MAYBE_Model) {\n  base::FilePath test_file;\n  base::PathService::Get(chrome::DIR_TEST_DATA, &test_file);\n  test_file =\n      test_file.AppendASCII(\"extensions/calculator_app/tests/automatic.html\");\n\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(),\n                                           net::FilePathToFileURL(test_file)));\n\n  ASSERT_EQ(true, content::EvalJs(\n                      browser()->tab_strip_model()->GetActiveWebContents(),\n                      \"window.runTests().success\"));\n}\n"
   }
 }
\ No newline at end of file
diff --git a/tools/disable_tests/tests/gtest-bug-comment.json b/tools/disable_tests/tests/gtest-bug-comment.json
index 77ed92e..ecea6ee 100644
--- a/tools/disable_tests/tests/gtest-bug-comment.json
+++ b/tools/disable_tests/tests/gtest-bug-comment.json
@@ -11,6 +11,6 @@
     "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   },
   "written_data": {
-    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\n// TODO(crbug.com/1234567): Re-enable this test\nIN_PROC_BROWSER_TEST_F(BrowserViewTest,\n                       DISABLED_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
+    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\n// TODO(crbug.com/40192031): Re-enable this test\nIN_PROC_BROWSER_TEST_F(BrowserViewTest,\n                       DISABLED_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   }
 }
diff --git a/tools/mb/mb.py b/tools/mb/mb.py
index bab8eda..a111c8ee 100755
--- a/tools/mb/mb.py
+++ b/tools/mb/mb.py
@@ -165,7 +165,7 @@
       subp.add_argument('--android-version-name',
                         help='Sets GN arg android_default_version_name')
 
-      # TODO(crbug.com/1060857): Remove this once swarming task templates
+      # TODO(crbug.com/40122201): Remove this once swarming task templates
       # support command prefixes.
       luci_auth_group = subp.add_mutually_exclusive_group()
       luci_auth_group.add_argument(
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 196bb276..661f345 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -11514,6 +11514,7 @@
   <int value="4945" label="V8LanguageTranslator_Translate_Method"/>
   <int value="4946" label="V8Translation_CanTranslate_Method"/>
   <int value="4947" label="V8Translation_CreateTranslator_Method"/>
+  <int value="4948" label="IdentityDigitalCredentialsDeepLink"/>
 </enum>
 
 <enum name="FeaturePolicyFeature">
@@ -18654,6 +18655,7 @@
   <int value="-1133285806" label="MacLoopbackAudioForScreenShare:disabled"/>
   <int value="-1132704128" label="AndroidPaymentAppsFilter:disabled"/>
   <int value="-1131726331" label="BackGestureRefactorAndroid:disabled"/>
+  <int value="-1130835436" label="SuspendStateMachine:disabled"/>
   <int value="-1128981647" label="EnableOAuthIpp:enabled"/>
   <int value="-1128912963" label="MediaControlsExpandGesture:disabled"/>
   <int value="-1128221789"
@@ -20451,6 +20453,7 @@
   <int value="-322937746" label="disable-desktop-capture-picker-new-ui"/>
   <int value="-322827131" label="tab-management-experiment-type-basil"/>
   <int value="-322684763" label="WebBluetoothRequestLargerMtu:disabled"/>
+  <int value="-321727218" label="SuspendStateMachine:enabled"/>
   <int value="-320820051" label="enable-zero-copy"/>
   <int value="-319235277" label="ShareMenu:disabled"/>
   <int value="-319002650" label="ArcUsbStorageUI:enabled"/>
diff --git a/tools/metrics/histograms/generate_flag_enums.py b/tools/metrics/histograms/generate_flag_enums.py
index b747d70..1eb97871 100755
--- a/tools/metrics/histograms/generate_flag_enums.py
+++ b/tools/metrics/histograms/generate_flag_enums.py
@@ -13,8 +13,8 @@
 
 # Import the UKM codegen library for its hashing function, which is the same
 # hashing function as used for flag names.
-# TODO(crbug.com/1371214) Move `codegen.HashName()` somewhere common so we don't
-#  depend on 'ukm'.
+# TODO(crbug.com/40870309) Move `codegen.HashName()` somewhere common so we
+# don't depend on 'ukm'.
 sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, 'ukm'))
 import codegen
 
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index c3ca41d..8d85cb5 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -4166,6 +4166,30 @@
   </summary>
 </histogram>
 
+<histogram name="Android.TabNavigationInterceptResult.ForMdoc"
+    enum="NavigationInterceptResult" expires_after="2024-09-29">
+  <owner>pkotwicz@chromium.org</owner>
+  <owner>rbyers@chromium.org</owner>
+  <summary>
+    The distribution of results when running ExternalNavigationHandler for
+    mdoc:// navigations which are intercepted. This shows how frequently mdoc://
+    navigations trigger a dialog (that the user may potentially cancel to cancel
+    the external app launch.)
+  </summary>
+</histogram>
+
+<histogram name="Android.TabNavigationInterceptResult.ForOpenId4Vp"
+    enum="NavigationInterceptResult" expires_after="2024-09-29">
+  <owner>pkotwicz@chromium.org</owner>
+  <owner>rbyers@chromium.org</owner>
+  <summary>
+    The distribution of results when running ExternalNavigationHandler for
+    openid4vp:// navigations which are intercepted. This shows how frequently
+    openid4vp:// navigations trigger a dialog (that the user may potentially
+    cancel to cancel the external app launch.)
+  </summary>
+</histogram>
+
 <histogram name="Android.TabNavigationInterceptResult.For{ProtocolType}"
     enum="NavigationInterceptResult" expires_after="2024-09-29">
   <owner>blundell@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/chromeos/enums.xml b/tools/metrics/histograms/metadata/chromeos/enums.xml
index 369a907..b04c06a 100644
--- a/tools/metrics/histograms/metadata/chromeos/enums.xml
+++ b/tools/metrics/histograms/metadata/chromeos/enums.xml
@@ -1751,6 +1751,12 @@
   <int value="2" label="Search"/>
 </enum>
 
+<enum name="SuspendStateMachineEvent">
+  <int value="0" label="Triggered"/>
+  <int value="1" label="Cancelled"/>
+  <int value="2" label="Suspended"/>
+</enum>
+
 <enum name="UmaInitParamsResult">
   <int value="0" label="Client ID and entropy sources were found"/>
   <int value="1" label="Only the client ID was found"/>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index 603838b9..19ae97c 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -1902,6 +1902,17 @@
   </summary>
 </histogram>
 
+<histogram name="ChromeOS.Inputs.SuspendStateMachine"
+    enum="SuspendStateMachineEvent" expires_after="2025-03-22">
+  <owner>dpad@google.com</owner>
+  <owner>cros-peripherals@google.com</owner>
+  <summary>
+    Records actions of the suspend state machine once it is triggered to start
+    tracking key releases. Result can either be cancelled or successfully
+    triggered suspend.
+  </summary>
+</histogram>
+
 <histogram
     name="ChromeOS.Inputs.TouchscreenUsage.Temporary.{TimePeriod}.{Mode}"
     units="ms" expires_after="2024-10-06">
diff --git a/tools/metrics/histograms/metadata/compose/enums.xml b/tools/metrics/histograms/metadata/compose/enums.xml
index a5e2345..46b7e76 100644
--- a/tools/metrics/histograms/metadata/compose/enums.xml
+++ b/tools/metrics/histograms/metadata/compose/enums.xml
@@ -128,7 +128,7 @@
   <int value="3" label="MSBB Shown"/>
   <int value="4" label="MSBB Settings Opened"/>
   <int value="5" label="MSBB Enabled In Session"/>
-  <int value="6" label="Sesstion started with selection"/>
+  <int value="6" label="Session started with selection"/>
   <int value="7" label="Create Clicked"/>
   <int value="8" label="Update Clicked"/>
   <int value="9" label="Retry Clicked"/>
@@ -145,6 +145,8 @@
   <int value="20" label="Cancel Edit Clicked"/>
   <int value="21" label="Used a modifier">Added in M124</int>
   <int value="22" label="Redo Clicked"/>
+  <int value="23" label="Result Edited"/>
+  <int value="24" label="Edited Result Inserted"/>
 </enum>
 
 <enum name="ComposeShowStatus">
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml
index 523dc57..ac3c4ce 100644
--- a/tools/metrics/histograms/metadata/history/histograms.xml
+++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -1809,6 +1809,46 @@
   </summary>
 </histogram>
 
+<histogram name="History.Embeddings.Search.Completed" enum="Boolean"
+    expires_after="2024-12-31">
+  <owner>orinj@chromium.org</owner>
+  <owner>tommycli@chromium.org</owner>
+  <summary>
+    Whether the search completed without interruption. Logged each time a vector
+    database search is performed.
+  </summary>
+</histogram>
+
+<histogram name="History.Embeddings.Search.Duration" units="ms"
+    expires_after="2024-12-31">
+  <owner>orinj@chromium.org</owner>
+  <owner>tommycli@chromium.org</owner>
+  <summary>
+    The number of milliseconds spent searching. Logged each time a vector
+    database search is performed.
+  </summary>
+</histogram>
+
+<histogram name="History.Embeddings.Search.EmbeddingCount" units="embeddings"
+    expires_after="2024-12-31">
+  <owner>orinj@chromium.org</owner>
+  <owner>tommycli@chromium.org</owner>
+  <summary>
+    The number of embeddings searched. Logged each time a vector database search
+    is performed.
+  </summary>
+</histogram>
+
+<histogram name="History.Embeddings.Search.UrlCount" units="urls"
+    expires_after="2024-12-31">
+  <owner>orinj@chromium.org</owner>
+  <owner>tommycli@chromium.org</owner>
+  <summary>
+    The number of URLs searched. Logged each time a vector database search is
+    performed.
+  </summary>
+</histogram>
+
 <histogram name="History.Embeddings.VisibilityModelAvailableAtQuery"
     enum="Boolean" expires_after="2024-12-31">
   <owner>sophiechang@chromium.org</owner>
diff --git a/tools/perf/core/upload_results_to_perf_dashboard.py b/tools/perf/core/upload_results_to_perf_dashboard.py
index 794c08c..3deae9f4 100755
--- a/tools/perf/core/upload_results_to_perf_dashboard.py
+++ b/tools/perf/core/upload_results_to_perf_dashboard.py
@@ -175,7 +175,8 @@
     # The HistogramSet might have been batched if it would be too large to
     # upload together. It's safe to concatenate the batches in order to write
     # output_json_file.
-    # TODO(crbug.com/918208): Use a script in catapult to merge dashboard_jsons.
+    # TODO(crbug.com/40607890): Use a script in catapult to merge
+    # dashboard_jsons.
     dashboard_json = sum(dashboard_jsons, [])
 
   if args.output_json_file:
diff --git a/tools/perf/measurements/rasterize_and_record_micro_unittest.py b/tools/perf/measurements/rasterize_and_record_micro_unittest.py
index 846f524a..c2a9433 100644
--- a/tools/perf/measurements/rasterize_and_record_micro_unittest.py
+++ b/tools/perf/measurements/rasterize_and_record_micro_unittest.py
@@ -17,7 +17,7 @@
   """
 
   # Fails or flaky on some bots.  See http://crbug.com/956798
-  # TODO(crbug.com/1197307): Re-enable on mojave.
+  # TODO(crbug.com/40760080): Re-enable on mojave.
   @decorators.Disabled('win', 'chromeos', 'linux', 'win7', 'mojave',
                        'android-nougat')  # Flaky: https://crbug.com/1342706
   def testRasterizeAndRecordMicro(self):
diff --git a/tools/perf/page_sets/rendering/rendering_stories.py b/tools/perf/page_sets/rendering/rendering_stories.py
index 90c301fa..0ba338e 100644
--- a/tools/perf/page_sets/rendering/rendering_stories.py
+++ b/tools/perf/page_sets/rendering/rendering_stories.py
@@ -67,11 +67,10 @@
         # 'backdrop-filter' CSS property to work.
         required_args.append('--enable-experimental-web-platform-features')
 
-      # TODO(crbug.com/968125): We must run without out-of-process rasterization
-      # until that branch is implemented for YUV decoding.
-      if (story_class.TAGS and
-          story_tags.IMAGE_DECODING in story_class.TAGS and
-          story_tags.GPU_RASTERIZATION in story_class.TAGS):
+      # TODO(crbug.com/40629637): We must run without out-of-process
+      # rasterization until that branch is implemented for YUV decoding.
+      if (story_class.TAGS and story_tags.IMAGE_DECODING in story_class.TAGS
+          and story_tags.GPU_RASTERIZATION in story_class.TAGS):
         required_args += ['--enable-gpu-rasterization']
         # Run RGB decoding with GPU rasterization (to be most comparable to YUV)
         self.AddStory(story_class(
diff --git a/tools/variations/fieldtrial_util.py b/tools/variations/fieldtrial_util.py
index 355d72cc..9490938 100644
--- a/tools/variations/fieldtrial_util.py
+++ b/tools/variations/fieldtrial_util.py
@@ -68,11 +68,11 @@
   --force-fieldtrials and --force-fieldtrial-params. Any such merged flags are
   moved to the end of the returned list. The original argument ordering is
   otherwise maintained.
-  TODO(crbug.com/1033090): Add functionality to handle duplicate flags using the
-  Foo<Bar syntax. Currently, the implementation considers e.g. 'Foo', 'Foo<Bar'
-  and 'Foo<Baz' to be different. Also add functionality to handle cases where
-  the same trial is specified with different groups via --force-fieldtrials,
-  which isn't currently unhandled.
+  TODO(crbug.com/40663174): Add functionality to handle duplicate flags using
+  the Foo<Bar syntax. Currently, the implementation considers e.g. 'Foo',
+  'Foo<Bar' and 'Foo<Baz' to be different. Also add functionality to handle
+  cases where the same trial is specified with different groups via
+  --force-fieldtrials, which isn't currently unhandled.
 
   Args:
     args: An iterable of strings representing command line arguments.
diff --git a/ui/accessibility/BUILD.gn b/ui/accessibility/BUILD.gn
index 728c359..f7c700b 100644
--- a/ui/accessibility/BUILD.gn
+++ b/ui/accessibility/BUILD.gn
@@ -361,7 +361,7 @@
 
     if (is_fuchsia) {
       additional_manifest_fragments = [
-        # TODO(https://crbug.com/1185811): Investigate removing the requirement
+        # TODO(crbug.com/40055105): Investigate removing the requirement
         # for VmexResource.
         "//build/config/fuchsia/test/mark_vmo_executable.shard.test-cml",
         "//build/config/fuchsia/test/network.shard.test-cml",
diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn
index c8dfc25..cba5389 100644
--- a/ui/compositor/BUILD.gn
+++ b/ui/compositor/BUILD.gn
@@ -292,7 +292,7 @@
     test_runner_shard = "//build/config/fuchsia/test/elf_test_ambient_exec_runner.shard.test-cml"
 
     additional_manifest_fragments = [
-      # TODO(https://crbug.com/1185811): Investigate removing the requirement
+      # TODO(crbug.com/40055105): Investigate removing the requirement
       # for VmexResource.
       "//build/config/fuchsia/test/mark_vmo_executable.shard.test-cml",
       "//build/config/fuchsia/test/present_view.shard.test-cml",
diff --git a/ui/gfx/color_conversion_sk_filter_cache.cc b/ui/gfx/color_conversion_sk_filter_cache.cc
index c579223..ab837860 100644
--- a/ui/gfx/color_conversion_sk_filter_cache.cc
+++ b/ui/gfx/color_conversion_sk_filter_cache.cc
@@ -37,7 +37,7 @@
   // backend, so perhaps this code should be moved to cc/
 #if defined(SK_GANESH)
   if (gr_context) {
-    // TODO(https://crbug.com/1286088): Consider adding mipmap support here.
+    // TODO(crbug.com/40210699): Consider adding mipmap support here.
     sk_sp<SkSurface> surface =
         SkSurfaces::RenderTarget(gr_context, skgpu::Budgeted::kNo, image_info,
                                  /*sampleCount=*/0, kTopLeft_GrSurfaceOrigin,
@@ -60,7 +60,7 @@
 #endif
 #if defined(SK_GRAPHITE)
   if (graphite_recorder) {
-    // TODO(https://crbug.com/1286088): Consider adding mipmap support here.
+    // TODO(crbug.com/40210699): Consider adding mipmap support here.
     sk_sp<SkSurface> surface = SkSurfaces::RenderTarget(
         graphite_recorder, image_info, skgpu::Mipmapped::kNo,
         /*surfaceProps=*/nullptr);
diff --git a/ui/snapshot/BUILD.gn b/ui/snapshot/BUILD.gn
index 1e35fc3..d1dd68b 100644
--- a/ui/snapshot/BUILD.gn
+++ b/ui/snapshot/BUILD.gn
@@ -124,7 +124,7 @@
     test_runner_shard = "//build/config/fuchsia/test/elf_test_ambient_exec_runner.shard.test-cml"
 
     additional_manifest_fragments = [
-      # TODO(https://crbug.com/1185811): Investigate removing the requirement
+      # TODO(crbug.com/40055105): Investigate removing the requirement
       # for VmexResource.
       "//build/config/fuchsia/test/mark_vmo_executable.shard.test-cml",
       "//build/config/fuchsia/test/present_view.shard.test-cml",
diff --git a/ui/views/animation/bubble_slide_animator_unittest.cc b/ui/views/animation/bubble_slide_animator_unittest.cc
index 450cf95..87a3f53 100644
--- a/ui/views/animation/bubble_slide_animator_unittest.cc
+++ b/ui/views/animation/bubble_slide_animator_unittest.cc
@@ -35,17 +35,14 @@
 class TestBubbleView : public BubbleDialogDelegateView {
  public:
   explicit TestBubbleView(View* anchor_view)
-      : BubbleDialogDelegateView(anchor_view, BubbleBorder::TOP_LEFT) {
+      : BubbleDialogDelegateView(anchor_view,
+                                 BubbleBorder::TOP_LEFT,
+                                 BubbleBorder::DIALOG_SHADOW,
+                                 true) {
     SetButtons(ui::DIALOG_BUTTON_NONE);
     SetLayoutManager(std::make_unique<FillLayout>());
     AddChildView(std::make_unique<View>())->SetPreferredSize(kTestViewSize);
   }
-
- protected:
-  void AddedToWidget() override {
-    BubbleDialogDelegateView::AddedToWidget();
-    SizeToContents();
-  }
 };
 
 class TestBubbleSlideAnimator : public BubbleSlideAnimator {
diff --git a/ui/views/bubble/bubble_dialog_model_host.cc b/ui/views/bubble/bubble_dialog_model_host.cc
index 81c9a8a..c6e575c 100644
--- a/ui/views/bubble/bubble_dialog_model_host.cc
+++ b/ui/views/bubble/bubble_dialog_model_host.cc
@@ -748,7 +748,10 @@
     View* anchor_view,
     BubbleBorder::Arrow arrow,
     ui::ModalType modal_type)
-    : BubbleDialogDelegate(anchor_view, arrow),
+    : BubbleDialogDelegate(anchor_view,
+                           arrow,
+                           views::BubbleBorder::DIALOG_SHADOW,
+                           true),
       model_(std::move(model)),
       // Make sure the modal type is set before calling InitContentsView which
       // uses IsModalDialog().
@@ -969,7 +972,6 @@
     // The banner is supposed to be purely decorative.
     banner_view->GetViewAccessibility().SetIsIgnored(true);
     GetBubbleFrameView()->SetHeaderView(std::move(banner_view));
-    SizeToContents();
   }
 }
 
@@ -1034,18 +1036,10 @@
 
 void BubbleDialogModelHost::OnContentsViewChanged() {
   UpdateSpacingAndMargins();
-
-  if (GetBubbleFrameView()) {
-    SizeToContents();
-  }
 }
 
 void BubbleDialogModelHost::OnDialogButtonChanged() {
   UpdateDialogButtons();
-
-  // If the contents of the dialog change (text, field visitiblity, etc.), the
-  // dialog may need to be resized.
-  SizeToContents();
 }
 
 void BubbleDialogModelHost::UpdateWindowIcon() {
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc
index 921158b5..957b1f6b 100644
--- a/ui/views/bubble/bubble_frame_view_unittest.cc
+++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -1036,7 +1036,7 @@
  public:
   TestWidthSnapDelegate(TestAnchor* anchor, bool should_snap) {
     DialogDelegate::SetButtons(should_snap ? ui::DIALOG_BUTTON_OK
-                                            : ui::DIALOG_BUTTON_NONE);
+                                           : ui::DIALOG_BUTTON_NONE);
     SetAnchorView(anchor->widget().GetContentsView());
     set_margins(gfx::Insets());
     BubbleDialogDelegateView::CreateBubble(this);
diff --git a/ui/views/bubble/info_bubble.cc b/ui/views/bubble/info_bubble.cc
index bb140ae..d61fb70 100644
--- a/ui/views/bubble/info_bubble.cc
+++ b/ui/views/bubble/info_bubble.cc
@@ -53,7 +53,10 @@
 InfoBubble::InfoBubble(View* anchor,
                        BubbleBorder::Arrow arrow,
                        const std::u16string& message)
-    : BubbleDialogDelegateView(anchor, arrow) {
+    : BubbleDialogDelegateView(anchor,
+                               arrow,
+                               views::BubbleBorder::DIALOG_SHADOW,
+                               true) {
   DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   set_margins(LayoutProvider::Get()->GetInsetsMetric(
@@ -121,7 +124,6 @@
 
   if (anchor_widget()->IsVisible() &&
       !GetAnchorView()->GetVisibleBounds().IsEmpty()) {
-    SizeToContents();
     widget->SetVisibilityChangedAnimationsEnabled(true);
     widget->ShowInactive();
   } else {
diff --git a/ui/views/controls/webview/web_dialog_view.cc b/ui/views/controls/webview/web_dialog_view.cc
index 933439e..1a2c66e 100644
--- a/ui/views/controls/webview/web_dialog_view.cc
+++ b/ui/views/controls/webview/web_dialog_view.cc
@@ -111,7 +111,8 @@
   SetWebViewCornersRadii(corner_radii);
 }
 
-gfx::Size WebDialogView::CalculatePreferredSize() const {
+gfx::Size WebDialogView::CalculatePreferredSize(
+    const SizeBounds& available_size) const {
   gfx::Size out;
   if (delegate_)
     delegate_->GetDialogSize(&out);
diff --git a/ui/views/controls/webview/web_dialog_view.h b/ui/views/controls/webview/web_dialog_view.h
index 36f11d3e..d7915d5 100644
--- a/ui/views/controls/webview/web_dialog_view.h
+++ b/ui/views/controls/webview/web_dialog_view.h
@@ -94,7 +94,8 @@
 
   // ClientView:
   void AddedToWidget() override;
-  gfx::Size CalculatePreferredSize() const override;
+  gfx::Size CalculatePreferredSize(
+      const SizeBounds& available_size) const override;
   gfx::Size GetMinimumSize() const override;
   bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
   void ViewHierarchyChanged(
diff --git a/ui/views/window/client_view.cc b/ui/views/window/client_view.cc
index a145c6e..bb08b95e 100644
--- a/ui/views/window/client_view.cc
+++ b/ui/views/window/client_view.cc
@@ -40,14 +40,15 @@
 ///////////////////////////////////////////////////////////////////////////////
 // ClientView, View overrides:
 
-gfx::Size ClientView::CalculatePreferredSize() const {
+gfx::Size ClientView::CalculatePreferredSize(
+    const SizeBounds& available_size) const {
   // |contents_view_| is allowed to be NULL up until the point where this view
   // is attached to a Container.
   if (!contents_view_) {
     return gfx::Size();
   }
 
-  return contents_view_->GetPreferredSize({});
+  return contents_view_->GetPreferredSize(available_size);
 }
 
 int ClientView::GetHeightForWidth(int width) const {
diff --git a/ui/views/window/client_view.h b/ui/views/window/client_view.h
index ffdc44d1..e770bc27 100644
--- a/ui/views/window/client_view.h
+++ b/ui/views/window/client_view.h
@@ -61,7 +61,8 @@
   virtual void UpdateWindowRoundedCorners(int corner_radius);
 
   // Overridden from View:
-  gfx::Size CalculatePreferredSize() const override;
+  gfx::Size CalculatePreferredSize(
+      const SizeBounds& available_size) const override;
   int GetHeightForWidth(int width) const override;
   gfx::Size GetMinimumSize() const override;
   gfx::Size GetMaximumSize() const override;
diff --git a/ui/views/window/dialog_client_view.cc b/ui/views/window/dialog_client_view.cc
index cbf6157..2aaa3b8 100644
--- a/ui/views/window/dialog_client_view.cc
+++ b/ui/views/window/dialog_client_view.cc
@@ -127,7 +127,8 @@
   }
 }
 
-gfx::Size DialogClientView::CalculatePreferredSize() const {
+gfx::Size DialogClientView::CalculatePreferredSize(
+    const SizeBounds& available_size) const {
   const gfx::Insets& content_margins = GetDialogDelegate()->margins();
 
   gfx::Size contents_size;
@@ -137,7 +138,10 @@
     contents_size = gfx::Size(content_width,
                               ClientView::GetHeightForWidth(content_width));
   } else {
-    contents_size = ClientView::CalculatePreferredSize();
+    SizeBounds content_available_size(available_size);
+    content_available_size.Enlarge(-content_margins.width(),
+                                   -content_margins.height());
+    contents_size = ClientView::CalculatePreferredSize(content_available_size);
   }
   contents_size.Enlarge(content_margins.width(), content_margins.height());
   return GetBoundingSizeForVerticalStack(
@@ -145,12 +149,9 @@
 }
 
 gfx::Size DialogClientView::GetMinimumSize() const {
-  // TODO(pbos): Try to find a way for ClientView::GetMinimumSize() to be
-  // fixed-width aware. For now this uses min-size = preferred size for
-  // fixed-width dialogs (even though min height might not be preferred height).
-  // Fixing this might require View::GetMinHeightForWidth().
   if (GetDialogDelegate()->fixed_width()) {
-    return CalculatePreferredSize();
+    return CalculatePreferredSize(
+        SizeBounds(GetDialogDelegate()->fixed_width(), {}));
   }
 
   return GetBoundingSizeForVerticalStack(
diff --git a/ui/views/window/dialog_client_view.h b/ui/views/window/dialog_client_view.h
index b243d10..2a681272 100644
--- a/ui/views/window/dialog_client_view.h
+++ b/ui/views/window/dialog_client_view.h
@@ -64,7 +64,8 @@
   void SetButtonRowInsets(const gfx::Insets& insets);
 
   // View implementation:
-  gfx::Size CalculatePreferredSize() const override;
+  gfx::Size CalculatePreferredSize(
+      const SizeBounds& available_size) const override;
   gfx::Size GetMinimumSize() const override;
   gfx::Size GetMaximumSize() const override;
   void VisibilityChanged(View* starting_from, bool is_visible) override;
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn
index 07c58c7..dfc52ac8 100644
--- a/ui/webui/resources/cr_elements/BUILD.gn
+++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -149,6 +149,7 @@
       "cr_shared_vars.css",
       "md_select.css",
       "mwb_element_shared_style.css",
+      "mwb_element_shared_style_lit.css",
       "mwb_shared_style.css",
       "mwb_shared_vars.css",
       "search_highlight_style.css",
diff --git a/ui/webui/resources/cr_elements/cr_menu_selector/cr_selectable_mixin.ts b/ui/webui/resources/cr_elements/cr_menu_selector/cr_selectable_mixin.ts
index 1926cc4..7321d410 100644
--- a/ui/webui/resources/cr_elements/cr_menu_selector/cr_selectable_mixin.ts
+++ b/ui/webui/resources/cr_elements/cr_menu_selector/cr_selectable_mixin.ts
@@ -88,8 +88,15 @@
     override firstUpdated(changedProperties: PropertyValues<this>) {
       super.firstUpdated(changedProperties);
       this.addEventListener('click', e => this.onClick_(e));
+      this.observeItems();
+    }
+
+    // Override this method in client code to modify the observation logic,
+    // or to turn it off completely. By default it listens for any changes on
+    // the first <slot> node in this shadowRoot.
+    observeItems() {
       this.getSlot_().addEventListener(
-          'slotchange', () => this.itemsChanged_());
+          'slotchange', () => this.itemsChanged());
     }
 
     override connectedCallback() {
@@ -155,10 +162,12 @@
       return slot;
     }
 
-    private updateItems_() {
+    // Override this method in client code to modify this logic, for example to
+    // grab children that don't reside in a <slot>.
+    queryItems(): Element[] {
       const elements = this.getSlot_().assignedElements();
       const excluded = ['template', 'dom-bind', 'dom-if', 'dom-repeat'];
-      this.items_ = elements.filter(el => {
+      return elements.filter(el => {
         if (excluded.includes(el.tagName)) {
           return false;
         }
@@ -166,6 +175,14 @@
       });
     }
 
+    private updateItems_() {
+      this.items_ = this.queryItems();
+    }
+
+    get selectedItem(): Element|null {
+      return this.selectedItem_;
+    }
+
     private updateSelectedItem_() {
       if (!this.items_) {
         return;
@@ -232,7 +249,7 @@
           item.getAttribute(this.attrForSelected);
     }
 
-    private itemsChanged_() {
+    itemsChanged() {
       this.updateItems_();
       this.updateSelectedItem_();
 
@@ -263,9 +280,15 @@
   attrForSelected: string|null;
   selected?: string|number;
   selectable?: string;
+  readonly selectedItem: Element|null;
 
   getItemsForTest(): Element[];
-  select(value: string|number): void;
+  itemsChanged(): void;
   selectNext(): void;
   selectPrevious(): void;
+  select(value: string|number): void;
+
+  // Methods to override to modify default behavior.
+  observeItems(): void;
+  queryItems(): Element[];
 }
diff --git a/ui/webui/resources/cr_elements/mwb_element_shared_style_lit.css b/ui/webui/resources/cr_elements/mwb_element_shared_style_lit.css
new file mode 100644
index 0000000..45554f1
--- /dev/null
+++ b/ui/webui/resources/cr_elements/mwb_element_shared_style_lit.css
@@ -0,0 +1,12 @@
+/* Copyright 2024 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #scheme=relative
+ * #import=./mwb_shared_vars.css.js
+ * #css_wrapper_metadata_end */
+
+/* Purposefully empty since this style is generated at build time from the
+ * equivalent Polymer version. */
diff --git a/url/gurl.cc b/url/gurl.cc
index 3e639dfb..4fcbe92 100644
--- a/url/gurl.cc
+++ b/url/gurl.cc
@@ -159,7 +159,7 @@
   if (is_valid_ || spec_.empty())
     return spec_;
 
-  // TODO(crbug.com/851128): Make sure this no longer hits before making
+  // TODO(crbug.com/40580068): Make sure this no longer hits before making
   // NOTREACHED_NORETURN();
   DUMP_WILL_BE_NOTREACHED_NORETURN()
       << "Trying to get the spec of an invalid URL!";