diff --git a/DEPS b/DEPS
index cd6d61ca..8259db0a 100644
--- a/DEPS
+++ b/DEPS
@@ -304,15 +304,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': 'e5e2a244238ca2c121fe6289a9451272491d250d',
+  'src_internal_revision': '7dd880d1117972980fe839be72f9165505873a49',
   # 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': 'd0d87c26b4899728b6e344d68843cae9f8c86c18',
+  'skia_revision': 'c0caf10486cef54391b302b6f8a797a1dd718dbb',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '90dbaf0f0a87e4a735175a655b95f86cb6445615',
+  'v8_revision': '66102d235335e4000aa5e3276c522f35aefb7c05',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
@@ -383,7 +383,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling chromium_variations
   # and whatever else without interference from each other.
-  'chromium_variations_revision': 'b09e04bd3002f6758419a23c3e057a8ef8a65dd7',
+  'chromium_variations_revision': '400b0ab61345c1de3f4cc5d819928d43e4c695a7',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -399,7 +399,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': 'f7b7071afe6e3177e406109af3e0831943c7fd1f',
+  'devtools_frontend_revision': 'dfaca3a03a86d3e30516ced2e537ad2e604e9bae',
   # 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.
@@ -423,11 +423,11 @@
   # 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': 'fda42b9b030a9da4a3f3b3dc994bdba9eeb36b38',
+  'dawn_revision': 'a4e7c436a37a648de5396a7f8f6b6e4ecefcd9dd',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': 'd3bc5ffc929b0895ae9e16774069a04ae6fe3c58',
+  'quiche_revision': '64cdc52a285d82dfd8756e0e30d15c2d08df6081',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -1004,12 +1004,12 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '50916c402a360c88c140143c8f1d7f8de2f6d393',
+    '59fdf4ae057ef3cddc5ef6654ab847e45fcdde6e',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + '8e629b8e931092d4def0971841ede11bb3e34d17',
+    'url': Var('chromium_git') + '/website.git' + '@' + '4c6c48346cb13f8dd27939d376bc4f2a97b86b39',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -1446,7 +1446,7 @@
 
   # For Linux and Chromium OS.
   'src/third_party/cros_system_api': {
-      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '8d58ca6b357e6827660dc26ca777c798f4426c2e',
+      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '6d8c1b4587f6081e2fa963647a34385cb5e712b3',
       'condition': 'checkout_linux or checkout_chromeos',
   },
 
@@ -1460,13 +1460,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '6421eb2eda04c003d77d26b1160082dcd6d249eb',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '2b6524b2085a41a4a0988d6e6e9c2f276ec83387',
 
   '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' + '@' + 'f29c0ec1aec9add36396f745cc2772f5a991ad4b',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '14ec2945940ec5f371f74442e9fafdbeaaf9a8c9',
     'condition': 'checkout_src_internal',
   },
 
@@ -1930,7 +1930,7 @@
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '09a4f3ec842a8932341b195c5b01e141c8a16eb7',
 
   'src/third_party/openscreen/src':
-    Var('chromium_git') + '/openscreen' + '@' + 'fdc8b9d28b02fe63c98dccb065bcb7de89fa90fc',
+    Var('chromium_git') + '/openscreen' + '@' + '84fbee0809f2264218383b71a063300ea048c234',
 
   'src/third_party/openxr/src': {
     'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '95fe35ffb383710a6e0567e958ead9a3b66e930c',
@@ -2173,7 +2173,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '6709673f56044c2d5749fe1c09b7194dfe22a7f2',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '7eff7e6d83a77bcb940d0b6fb5d2697010e82b3b',
+    Var('webrtc_git') + '/src.git' + '@' + 'f80bea13b5b06b1e0734a5189992f79fc2dada8a',
 
   # 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.
@@ -4350,7 +4350,7 @@
 
   'src/components/optimization_guide/internal': {
       'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' +
-        '34b29022eb79491ade7c25cf27a350a3b640842b',
+        '441a92077f35cf38636bd61cc91d9a1bbbae43be',
       'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwPrerenderTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwPrerenderTest.java
index 801037c..4f1e6e3 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwPrerenderTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwPrerenderTest.java
@@ -37,6 +37,7 @@
 import org.chromium.components.embedder_support.util.WebResourceResponseInfo;
 import org.chromium.content_public.browser.test.util.TestCallbackHelperContainer.OnPageStartedHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.content_public.common.ContentFeatures;
 
 import java.io.FileInputStream;
 import java.io.UnsupportedEncodingException;
@@ -216,6 +217,20 @@
         Assert.assertEquals(url, data.getAsString());
     }
 
+    // Navigates the primary page to `url` by client side redirection.
+    private void navigatePage(String url) throws Exception {
+        OnPageStartedHelper onPageStartedHelper = mContentsClient.getOnPageStartedHelper();
+        int currentOnPageStartedCallCount = onPageStartedHelper.getCallCount();
+        mActivityTestRule.runOnUiThread(
+                () -> {
+                    final String navigationScript = String.format("location.href = `%s`;", url);
+                    mAwContents.evaluateJavaScript(navigationScript, null);
+                });
+        onPageStartedHelper.waitForCallback(
+                currentOnPageStartedCallCount, 1, SCALED_WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        Assert.assertEquals(onPageStartedHelper.getUrl(), url);
+    }
+
     // Activates a prerendered page by navigating to `activateUrl`. `expectedActivatedUrl` indicates
     // a URL that should actually be activated. Generally, `expectedActivatedUrl` is the same as
     // `activateUrl`, but they are different when prerendering navigation is redirected.
@@ -319,6 +334,69 @@
         activatePage(mPrerenderingUrl, ActivationBy.LOAD_URL);
     }
 
+    // Tests speculation rules prerendering with No-Vary-Search header.
+    @Test
+    @LargeTest
+    @Feature({"AndroidWebView"})
+    @Features.EnableFeatures({ContentFeatures.PRERENDER2_NO_VARY_SEARCH})
+    @Features.DisableFeatures({BlinkFeatures.PRERENDER2_MEMORY_CONTROLS})
+    public void testNoVarySearchHeader() throws Throwable {
+        setPreloadingAllowed(PreloadingAllowedFlags.PRERENDER_ENABLED);
+        loadInitialPage();
+
+        var histogramWatcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecord(
+                                "Prerender.Experimental.PrerenderHostFinalStatus.SpeculationRule",
+                                /*kActivated*/ 0)
+                        .build();
+
+        // Start prerendering `prerender.html`. This response will have
+        // `No-Vary-Search: params=("a")` header.
+        injectSpeculationRulesAndWait(mPrerenderingUrl);
+
+        // Navigate to `prerender.html?a=42`. This doesn't exactly match the prerendering URL but
+        // should activate the prerendered page for the No-Vary-Search header.
+        String url = mTestServer.getURL(PRERENDER_URL.concat("?a=42"));
+        activatePage(url, ActivationBy.JAVASCRIPT);
+
+        // Wait until the navigation activates the prerendered page.
+        histogramWatcher.pollInstrumentationThreadUntilSatisfied();
+    }
+
+    // Tests speculation rules prerendering with No-Vary-Search header. This is similar to the
+    // previous test but navigates to a URL whose search param is different from the No-Vary-Search
+    // header. This should not activate the prerendered page.
+    @Test
+    @LargeTest
+    @Feature({"AndroidWebView"})
+    @Features.EnableFeatures({ContentFeatures.PRERENDER2_NO_VARY_SEARCH})
+    @Features.DisableFeatures({BlinkFeatures.PRERENDER2_MEMORY_CONTROLS})
+    public void testNoVarySearchHeaderUnignorableSearchParam() throws Throwable {
+        setPreloadingAllowed(PreloadingAllowedFlags.PRERENDER_ENABLED);
+        loadInitialPage();
+
+        var histogramWatcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecord(
+                                "Prerender.Experimental.PrerenderHostFinalStatus.SpeculationRule",
+                                /*kTriggerDestroyed*/ 16)
+                        .build();
+
+        // Start prerendering `prerender.html`. This response will have
+        // `No-Vary-Search: params=("a")` header.
+        injectSpeculationRulesAndWait(mPrerenderingUrl);
+
+        // Navigate to `prerender.html?b=42`. This doesn't match even with the No-Vary-Search
+        // header.
+        String url = mTestServer.getURL(PRERENDER_URL.concat("?b=42"));
+        navigatePage(url);
+
+        // Wait until prerendering is canceled for navigation to the URL whose search param is
+        // unignorable.
+        histogramWatcher.pollInstrumentationThreadUntilSatisfied();
+    }
+
     // Tests FrameTree swap of AwContentsIoThreadClient by observing that callbacks are correctly
     // called after prerender activation.
     @Test
diff --git a/android_webview/test/data/OWNERS b/android_webview/test/data/OWNERS
index 3be286b..fe4e50bf 100644
--- a/android_webview/test/data/OWNERS
+++ b/android_webview/test/data/OWNERS
@@ -1,2 +1,2 @@
 # Prerendering
-per-file prerender.html=file://content/browser/preloading/prerender/OWNERS
+per-file prerender*=file://content/browser/preloading/prerender/OWNERS
diff --git a/android_webview/test/data/prerender.html.mock-http-headers b/android_webview/test/data/prerender.html.mock-http-headers
new file mode 100644
index 0000000..ed22143
--- /dev/null
+++ b/android_webview/test/data/prerender.html.mock-http-headers
@@ -0,0 +1,2 @@
+HTTP/1.1 200 OK
+No-Vary-Search: params=("a")
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index aa52952..d185346 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1675,6 +1675,8 @@
     "system/focus_mode/sounds/focus_mode_sounds_view.h",
     "system/focus_mode/sounds/playlist_image_button.cc",
     "system/focus_mode/sounds/playlist_image_button.h",
+    "system/focus_mode/sounds/playlist_view.cc",
+    "system/focus_mode/sounds/playlist_view.h",
     "system/focus_mode/sounds/sound_section_view.cc",
     "system/focus_mode/sounds/sound_section_view.h",
     "system/focus_mode/youtube_music/youtube_music_client.cc",
diff --git a/ash/constants/ash_switches.cc b/ash/constants/ash_switches.cc
index bbd240c..ebd7a68e 100644
--- a/ash/constants/ash_switches.cc
+++ b/ash/constants/ash_switches.cc
@@ -958,6 +958,10 @@
 const char kOobeShowAccessibilityButtonOnMarketingOptInForTesting[] =
     "oobe-show-accessibility-button-on-marketing-opt-in-for-testing";
 
+// Skips new user check in the personalized recommend apps screen for testing.
+const char kOobeSkipNewUserCheckForTesting[] =
+    "oobe-skip-new-user-check-for-testing";
+
 // Skips all other OOBE pages after user login.
 const char kOobeSkipPostLogin[] = "oobe-skip-postlogin";
 
@@ -1209,6 +1213,11 @@
       kTetherHostScansIgnoreWiredConnections);
 }
 
+bool ShouldSkipNewUserCheckForTesting() {
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+      kOobeSkipNewUserCheckForTesting);
+}
+
 bool ShouldSkipOobePostLogin() {
   return base::CommandLine::ForCurrentProcess()->HasSwitch(kOobeSkipPostLogin);
 }
diff --git a/ash/constants/ash_switches.h b/ash/constants/ash_switches.h
index c4f0add5..2a8c46b 100644
--- a/ash/constants/ash_switches.h
+++ b/ash/constants/ash_switches.h
@@ -298,6 +298,8 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kOobeScreenshotDirectory[];
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const char kOobeShowAccessibilityButtonOnMarketingOptInForTesting[];
+COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const char kOobeSkipNewUserCheckForTesting[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kOobeSkipPostLogin[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kOobeSkipToLogin[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kOobeTimerInterval[];
@@ -407,6 +409,9 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 bool ShouldTetherHostScansIgnoreWiredConnections();
 
+// Returns true if we should skip new user check on the recommend apps screen.
+COMPONENT_EXPORT(ASH_CONSTANTS) bool ShouldSkipNewUserCheckForTesting();
+
 // Returns true if we should skip all other OOBE pages after user login.
 COMPONENT_EXPORT(ASH_CONSTANTS) bool ShouldSkipOobePostLogin();
 
diff --git a/ash/picker/model/picker_model.cc b/ash/picker/model/picker_model.cc
index 6ff429a7..6ed175b 100644
--- a/ash/picker/model/picker_model.cc
+++ b/ash/picker/model/picker_model.cc
@@ -67,6 +67,18 @@
   return categories;
 }
 
+std::vector<PickerCategory> PickerModel::GetRecentResultsCategories() const {
+  if (HasSelectedText()) {
+    return std::vector<PickerCategory>{};
+  }
+
+  return {
+      PickerCategory::kDriveFiles,
+      PickerCategory::kLocalFiles,
+      PickerCategory::kLinks,
+  };
+}
+
 bool PickerModel::HasSelectedText() const {
   return !selected_text_.empty();
 }
diff --git a/ash/picker/model/picker_model.h b/ash/picker/model/picker_model.h
index 33847b4..423a09b 100644
--- a/ash/picker/model/picker_model.h
+++ b/ash/picker/model/picker_model.h
@@ -33,6 +33,8 @@
 
   std::vector<PickerCategory> GetAvailableCategories() const;
 
+  std::vector<PickerCategory> GetRecentResultsCategories() const;
+
   std::u16string_view selected_text() const;
 
   bool HasSelectedText() const;
diff --git a/ash/picker/picker_controller.cc b/ash/picker/picker_controller.cc
index 33f3e740..e3a1ce0 100644
--- a/ash/picker/picker_controller.cc
+++ b/ash/picker/picker_controller.cc
@@ -361,8 +361,9 @@
                            : model_->GetAvailableCategories();
 }
 
-bool PickerController::ShouldShowRecentResults() {
-  return model_ && !model_->HasSelectedText();
+std::vector<PickerCategory> PickerController::GetRecentResultsCategories() {
+  return model_ == nullptr ? std::vector<PickerCategory>{}
+                           : model_->GetRecentResultsCategories();
 }
 
 void PickerController::GetResultsForCategory(PickerCategory category,
diff --git a/ash/picker/picker_controller.h b/ash/picker/picker_controller.h
index e811d92e..7c59c74 100644
--- a/ash/picker/picker_controller.h
+++ b/ash/picker/picker_controller.h
@@ -75,7 +75,7 @@
 
   // PickerViewDelegate:
   std::vector<PickerCategory> GetAvailableCategories() override;
-  bool ShouldShowRecentResults() override;
+  std::vector<PickerCategory> GetRecentResultsCategories() override;
   void GetResultsForCategory(PickerCategory category,
                              SearchResultsCallback callback) override;
   void TransformSelectedText(PickerCategory category) override;
diff --git a/ash/picker/views/picker_view.cc b/ash/picker/views/picker_view.cc
index fb166fe..a4576166 100644
--- a/ash/picker/views/picker_view.cc
+++ b/ash/picker/views/picker_view.cc
@@ -146,6 +146,19 @@
   }
 }
 
+std::vector<PickerSearchResult> GetMostRecentResult(
+    std::vector<PickerSearchResultsSection> results) {
+  if (results.empty() ||
+      results[0].type() != PickerSectionType::kRecentlyUsed) {
+    return {};
+  }
+  base::span<const PickerSearchResult> search_results = results[0].results();
+  if (search_results.empty()) {
+    return {};
+  }
+  return {search_results[0]};
+}
+
 }  // namespace
 
 PickerView::PickerView(PickerViewDelegate* delegate,
@@ -209,6 +222,13 @@
   SelectSearchResult(result);
 }
 
+void PickerView::GetZeroStateRecentResults(PickerCategory category,
+                                           SearchResultsCallback callback) {
+  delegate_->GetResultsForCategory(
+      category,
+      base::BindRepeating(&GetMostRecentResult).Then(std::move(callback)));
+}
+
 void PickerView::GetSuggestedZeroStateEditorResults(
     SuggestedEditorResultsCallback callback) {
   delegate_->GetSuggestedEditorResults(std::move(callback));
@@ -397,7 +417,7 @@
   zero_state_view_ =
       contents_view_->AddPage(std::make_unique<PickerZeroStateView>(
           this, delegate_->GetAvailableCategories(),
-          delegate_->ShouldShowRecentResults(), kMaxSize.width(),
+          delegate_->GetRecentResultsCategories(), kMaxSize.width(),
           delegate_->GetAssetFetcher()));
 
   category_view_ = contents_view_->AddPage(std::make_unique<PickerCategoryView>(
diff --git a/ash/picker/views/picker_view.h b/ash/picker/views/picker_view.h
index bbc6ddf4..0e7f5f6 100644
--- a/ash/picker/views/picker_view.h
+++ b/ash/picker/views/picker_view.h
@@ -73,6 +73,8 @@
   // PickerZeroStateViewDelegate:
   void SelectZeroStateCategory(PickerCategory category) override;
   void SelectZeroStateResult(const PickerSearchResult& result) override;
+  void GetZeroStateRecentResults(PickerCategory category,
+                                 SearchResultsCallback callback) override;
   void GetSuggestedZeroStateEditorResults(
       SuggestedEditorResultsCallback callback) override;
   void NotifyPseudoFocusChanged(views::View* view) override;
diff --git a/ash/picker/views/picker_view_delegate.h b/ash/picker/views/picker_view_delegate.h
index c269d38c..429b470 100644
--- a/ash/picker/views/picker_view_delegate.h
+++ b/ash/picker/views/picker_view_delegate.h
@@ -32,8 +32,9 @@
 
   virtual std::vector<PickerCategory> GetAvailableCategories() = 0;
 
-  // Returns whether we should show suggested results in zero state view.
-  virtual bool ShouldShowRecentResults() = 0;
+  // Returns categories for which we should show recent results in zero state
+  // view.
+  virtual std::vector<PickerCategory> GetRecentResultsCategories() = 0;
 
   // Gets initially suggested results for category. Results will be returned via
   // `callback`, which may be called multiples times to update the results.
diff --git a/ash/picker/views/picker_view_unittest.cc b/ash/picker/views/picker_view_unittest.cc
index 5847477..567402c 100644
--- a/ash/picker/views/picker_view_unittest.cc
+++ b/ash/picker/views/picker_view_unittest.cc
@@ -115,7 +115,9 @@
     requested_case_transformation_category_ = category;
   }
 
-  bool ShouldShowRecentResults() override { return true; }
+  std::vector<PickerCategory> GetRecentResultsCategories() override {
+    return {PickerCategory::kDriveFiles};
+  }
 
   void GetResultsForCategory(PickerCategory category,
                              SearchResultsCallback callback) override {
diff --git a/ash/picker/views/picker_widget_unittest.cc b/ash/picker/views/picker_widget_unittest.cc
index 3740cfd7..53b24555 100644
--- a/ash/picker/views/picker_widget_unittest.cc
+++ b/ash/picker/views/picker_widget_unittest.cc
@@ -32,7 +32,9 @@
  public:
   // PickerViewDelegate:
   std::vector<PickerCategory> GetAvailableCategories() override { return {}; }
-  bool ShouldShowRecentResults() override { return false; }
+  std::vector<PickerCategory> GetRecentResultsCategories() override {
+    return {};
+  }
   void GetResultsForCategory(PickerCategory category,
                              SearchResultsCallback callback) override {}
   void TransformSelectedText(PickerCategory category) override {}
diff --git a/ash/picker/views/picker_zero_state_view.cc b/ash/picker/views/picker_zero_state_view.cc
index 1ddc1b5..a41682e 100644
--- a/ash/picker/views/picker_zero_state_view.cc
+++ b/ash/picker/views/picker_zero_state_view.cc
@@ -48,54 +48,11 @@
 #include "ui/views/view_utils.h"
 
 namespace ash {
-namespace {
-constexpr base::TimeDelta kClipboardRecency = base::Seconds(60);
-
-std::unique_ptr<PickerListItemView> CreateListItemViewForClipboardResult(
-    const PickerSearchResult::ClipboardData& data,
-    PickerListItemView::SelectItemCallback callback) {
-  auto item_view = std::make_unique<PickerListItemView>(std::move(callback));
-  item_view->SetLeadingIcon(ui::ImageModel::FromVectorIcon(
-      kClipboardIcon, cros_tokens::kCrosSysOnSurface));
-  item_view->SetSecondaryText(
-      l10n_util::GetStringUTF16(IDS_PICKER_FROM_CLIPBOARD_TEXT));
-  switch (data.display_format) {
-    case PickerSearchResult::ClipboardData::DisplayFormat::kFile:
-    case PickerSearchResult::ClipboardData::DisplayFormat::kText:
-      item_view->SetPrimaryText(data.display_text);
-      break;
-    case PickerSearchResult::ClipboardData::DisplayFormat::kImage:
-      if (!data.display_image.has_value()) {
-        return nullptr;
-      }
-      item_view->SetPrimaryImage(
-          std::make_unique<views::ImageView>(*data.display_image));
-      break;
-    case PickerSearchResult::ClipboardData::DisplayFormat::kHtml:
-      item_view->SetPrimaryText(
-          l10n_util::GetStringUTF16(IDS_PICKER_HTML_CONTENT));
-      break;
-  }
-  return item_view;
-}
-
-std::unique_ptr<PickerListItemView> CreateListItemViewForSearchResult(
-    const PickerSearchResult& result,
-    PickerListItemView::SelectItemCallback callback) {
-  // Only supports Clipboard results right now.
-  if (auto* data =
-          std::get_if<PickerSearchResult::ClipboardData>(&result.data())) {
-    return CreateListItemViewForClipboardResult(*data, std::move(callback));
-  }
-  return nullptr;
-}
-
-}  // namespace
 
 PickerZeroStateView::PickerZeroStateView(
     PickerZeroStateViewDelegate* delegate,
     base::span<const PickerCategory> available_categories,
-    bool show_recent_results,
+    base::span<const PickerCategory> recent_results_categories,
     int picker_view_width,
     PickerAssetFetcher* asset_fetcher)
     : delegate_(delegate) {
@@ -105,12 +62,11 @@
   section_list_view_ = AddChildView(std::make_unique<PickerSectionListView>(
       picker_view_width, asset_fetcher));
 
-  if (show_recent_results) {
-    clipboard_provider_ = std::make_unique<PickerClipboardProvider>();
-    clipboard_provider_->FetchResults(
+  for (PickerCategory category : recent_results_categories) {
+    delegate_->GetZeroStateRecentResults(
+        category,
         base::BindRepeating(&PickerZeroStateView::OnFetchRecentResults,
-                            weak_ptr_factory_.GetWeakPtr()),
-        u"", kClipboardRecency);
+                            weak_ptr_factory_.GetWeakPtr()));
   }
 
   if (base::Contains(available_categories, PickerCategory::kEditorRewrite)) {
@@ -324,13 +280,9 @@
         GetSectionTitleForPickerSectionType(PickerSectionType::kRecentlyUsed));
   }
   for (const auto& result : results) {
-    if (std::unique_ptr<PickerListItemView> item_view =
-            CreateListItemViewForSearchResult(
-                result,
-                base::BindRepeating(&PickerZeroStateView::OnResultSelected,
-                                    weak_ptr_factory_.GetWeakPtr(), result))) {
-      recent_section_view_->AddListItem(std::move(item_view));
-    }
+    recent_section_view_->AddResult(
+        result, base::BindRepeating(&PickerZeroStateView::OnResultSelected,
+                                    weak_ptr_factory_.GetWeakPtr(), result));
   }
   SetPseudoFocusedView(section_list_view_->GetTopItem());
 }
diff --git a/ash/picker/views/picker_zero_state_view.h b/ash/picker/views/picker_zero_state_view.h
index 2fa876a..a4e0db0 100644
--- a/ash/picker/views/picker_zero_state_view.h
+++ b/ash/picker/views/picker_zero_state_view.h
@@ -39,7 +39,7 @@
   explicit PickerZeroStateView(
       PickerZeroStateViewDelegate* delegate,
       base::span<const PickerCategory> available_categories,
-      bool show_suggested_results,
+      base::span<const PickerCategory> recent_results_categories,
       int picker_view_width,
       PickerAssetFetcher* asset_fetcher);
   PickerZeroStateView(const PickerZeroStateView&) = delete;
diff --git a/ash/picker/views/picker_zero_state_view_delegate.h b/ash/picker/views/picker_zero_state_view_delegate.h
index 134e7660..00fee1b3 100644
--- a/ash/picker/views/picker_zero_state_view_delegate.h
+++ b/ash/picker/views/picker_zero_state_view_delegate.h
@@ -22,10 +22,16 @@
   using SuggestedEditorResultsCallback =
       base::OnceCallback<void(std::vector<PickerSearchResult>)>;
 
+  using SearchResultsCallback =
+      base::RepeatingCallback<void(std::vector<PickerSearchResult>)>;
+
   virtual void SelectZeroStateCategory(PickerCategory category) = 0;
 
   virtual void SelectZeroStateResult(const PickerSearchResult& result) = 0;
 
+  virtual void GetZeroStateRecentResults(PickerCategory category,
+                                         SearchResultsCallback callback) = 0;
+
   virtual void GetSuggestedZeroStateEditorResults(
       SuggestedEditorResultsCallback callback) = 0;
 
diff --git a/ash/picker/views/picker_zero_state_view_unittest.cc b/ash/picker/views/picker_zero_state_view_unittest.cc
index 28f552e..58fbcb9 100644
--- a/ash/picker/views/picker_zero_state_view_unittest.cc
+++ b/ash/picker/views/picker_zero_state_view_unittest.cc
@@ -34,6 +34,7 @@
 namespace ash {
 namespace {
 
+using ::testing::_;
 using ::testing::AllOf;
 using ::testing::Contains;
 using ::testing::ElementsAre;
@@ -79,6 +80,10 @@
               GetSuggestedZeroStateEditorResults,
               (SuggestedEditorResultsCallback),
               (override));
+  MOCK_METHOD(void,
+              GetZeroStateRecentResults,
+              (PickerCategory, SearchResultsCallback),
+              (override));
   MOCK_METHOD(void, NotifyPseudoFocusChanged, (views::View*), (override));
 };
 
@@ -92,7 +97,7 @@
 
 TEST_F(PickerZeroStateViewTest, CreatesCategorySections) {
   MockZeroStateViewDelegate mock_delegate;
-  PickerZeroStateView view(&mock_delegate, kAllCategories, true, kPickerWidth,
+  PickerZeroStateView view(&mock_delegate, kAllCategories, {}, kPickerWidth,
                            &asset_fetcher_);
 
   EXPECT_THAT(view.section_views_for_testing(),
@@ -109,7 +114,7 @@
   MockZeroStateViewDelegate mock_delegate;
   auto* view = widget->SetContentsView(std::make_unique<PickerZeroStateView>(
       &mock_delegate, std::vector<PickerCategory>{PickerCategory::kExpressions},
-      false, kPickerWidth, &asset_fetcher_));
+      std::vector<PickerCategory>{}, kPickerWidth, &asset_fetcher_));
   widget->Show();
   ASSERT_THAT(view->section_views_for_testing(),
               Contains(Key(PickerCategoryType::kGeneral)));
@@ -129,43 +134,33 @@
   LeftClickOn(*category_view);
 }
 
-TEST_F(PickerZeroStateViewTest, ShowsClipboardItems) {
-  base::UnguessableToken item_id;
-  testing::StrictMock<MockClipboardHistoryController> mock_clipboard;
-  EXPECT_CALL(mock_clipboard, GetHistoryValues)
-      .WillOnce(
-          [&item_id](
-              ClipboardHistoryController::GetHistoryValuesCallback callback) {
-            ClipboardHistoryItemBuilder builder;
-            ClipboardHistoryItem item =
-                builder.SetFormat(ui::ClipboardInternalFormat::kText)
-                    .SetText("test")
-                    .Build();
-            item_id = item.id();
-            std::move(callback).Run({std::move(item)});
-          });
+TEST_F(PickerZeroStateViewTest, ShowsRecentItems) {
+  MockZeroStateViewDelegate mock_delegate;
+  EXPECT_CALL(mock_delegate,
+              GetZeroStateRecentResults(PickerCategory::kDriveFiles, _))
+      .WillOnce([](PickerCategory category,
+                   MockZeroStateViewDelegate::SearchResultsCallback callback) {
+        std::move(callback).Run({PickerSearchResult::DriveFile(
+            /*title=*/u"test drive file",
+            /*url=*/GURL(),
+            /*icon=*/{})});
+      });
 
   std::unique_ptr<views::Widget> widget = CreateTestWidget();
   widget->SetFullscreen(true);
   base::test::TestFuture<const PickerSearchResult&> future;
-  MockZeroStateViewDelegate mock_delegate;
   auto* view = widget->SetContentsView(std::make_unique<PickerZeroStateView>(
-      &mock_delegate, kAllCategories, true, kPickerWidth, &asset_fetcher_));
+      &mock_delegate, kAllCategories,
+      std::vector<PickerCategory>{PickerCategory::kDriveFiles}, kPickerWidth,
+      &asset_fetcher_));
   widget->Show();
 
-  EXPECT_CALL(
-      mock_delegate,
-      SelectZeroStateResult(Property(
-          "data", &ash::PickerSearchResult::data,
-          VariantWith<ash::PickerSearchResult::ClipboardData>(AllOf(
-              Field("item_id", &ash::PickerSearchResult::ClipboardData::item_id,
-                    item_id),
-              Field("display_format",
-                    &ash::PickerSearchResult::ClipboardData::display_format,
-                    PickerSearchResult::ClipboardData::DisplayFormat::kText),
-              Field("display_text",
-                    &ash::PickerSearchResult::ClipboardData::display_text,
-                    u"test"))))))
+  EXPECT_CALL(mock_delegate,
+              SelectZeroStateResult(Property(
+                  "data", &ash::PickerSearchResult::data,
+                  VariantWith<ash::PickerSearchResult::DriveFileData>(Field(
+                      "title", &ash::PickerSearchResult::DriveFileData::title,
+                      u"test drive file")))))
       .Times(1);
 
   ASSERT_THAT(view->RecentSectionForTesting(), Not(IsNull()));
@@ -175,35 +170,6 @@
   LeftClickOn(*item_view);
 }
 
-TEST_F(PickerZeroStateViewTest, HidesRecentSectionWhenNoItemsToDisplay) {
-  testing::StrictMock<MockClipboardHistoryController> mock_clipboard;
-  EXPECT_CALL(mock_clipboard, GetHistoryValues)
-      .WillOnce(
-          [](ClipboardHistoryController::GetHistoryValuesCallback callback) {
-            std::move(callback).Run({});
-          });
-
-  std::unique_ptr<views::Widget> widget = CreateTestWidget();
-  widget->SetFullscreen(true);
-  MockZeroStateViewDelegate mock_delegate;
-  auto* view = widget->SetContentsView(std::make_unique<PickerZeroStateView>(
-      &mock_delegate, kAllCategories, true, kPickerWidth, &asset_fetcher_));
-  widget->Show();
-
-  EXPECT_THAT(view->RecentSectionForTesting(), IsNull());
-}
-
-TEST_F(PickerZeroStateViewTest, DoesntShowClipboardItems) {
-  std::unique_ptr<views::Widget> widget = CreateTestWidget();
-  widget->SetFullscreen(true);
-  MockZeroStateViewDelegate mock_delegate;
-  auto* view = widget->SetContentsView(std::make_unique<PickerZeroStateView>(
-      &mock_delegate, kAllCategories, false, kPickerWidth, &asset_fetcher_));
-  widget->Show();
-
-  EXPECT_THAT(view->RecentSectionForTesting(), IsNull());
-}
-
 TEST_F(PickerZeroStateViewTest,
        DoesntShowEditorRewriteCategoryForEmptySuggestions) {
   MockZeroStateViewDelegate mock_delegate;
@@ -211,7 +177,7 @@
       .WillOnce([](MockZeroStateViewDelegate::SuggestedEditorResultsCallback
                        callback) { std::move(callback).Run({}); });
   PickerZeroStateView view(&mock_delegate, {{PickerCategory::kEditorRewrite}},
-                           false, kPickerWidth, &asset_fetcher_);
+                           {}, kPickerWidth, &asset_fetcher_);
 
   EXPECT_THAT(
       view.section_views_for_testing(),
@@ -239,7 +205,7 @@
         });
       });
   PickerZeroStateView view(&mock_delegate, {{PickerCategory::kEditorRewrite}},
-                           false, kPickerWidth, &asset_fetcher_);
+                           {}, kPickerWidth, &asset_fetcher_);
 
   EXPECT_THAT(
       view.section_views_for_testing(),
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn
index 7cf938f..7dc5fad 100644
--- a/ash/resources/vector_icons/BUILD.gn
+++ b/ash/resources/vector_icons/BUILD.gn
@@ -130,8 +130,6 @@
     "filter.icon",
     "five_files.icon",
     "focus_mode_lamp.icon",
-    "focus_mode_play_circle.icon",
-    "focus_mode_stop_circle.icon",
     "folder.icon",
     "forbid.icon",
     "four_files.icon",
diff --git a/ash/resources/vector_icons/focus_mode_play_circle.icon b/ash/resources/vector_icons/focus_mode_play_circle.icon
deleted file mode 100644
index 9cf742f..0000000
--- a/ash/resources/vector_icons/focus_mode_play_circle.icon
+++ /dev/null
@@ -1,39 +0,0 @@
-// 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.
-
-CANVAS_DIMENSIONS, 20,
-MOVE_TO, 8.2f, 13.65f,
-LINE_TO, 13.15f, 10.5f,
-LINE_TO, 8.2f, 7.35f,
-V_LINE_TO, 13.65f,
-CLOSE,
-MOVE_TO, 10, 17.7f,
-CUBIC_TO, 9.01f, 17.7f, 8.08f, 17.51f, 7.21f, 17.14f,
-CUBIC_TO, 6.33f, 16.76f, 5.56f, 16.25f, 4.9f, 15.6f,
-CUBIC_TO, 4.25f, 14.94f, 3.74f, 14.17f, 3.36f, 13.29f,
-CUBIC_TO, 2.99f, 12.42f, 2.8f, 11.49f, 2.8f, 10.5f,
-CUBIC_TO, 2.8f, 9.5f, 2.99f, 8.57f, 3.36f, 7.71f,
-CUBIC_TO, 3.74f, 6.83f, 4.25f, 6.07f, 4.9f, 5.42f,
-CUBIC_TO, 5.56f, 4.76f, 6.33f, 4.24f, 7.21f, 3.86f,
-CUBIC_TO, 8.08f, 3.49f, 9.01f, 3.3f, 10, 3.3f,
-CUBIC_TO, 11, 3.3f, 11.93f, 3.49f, 12.79f, 3.86f,
-CUBIC_TO, 13.67f, 4.24f, 14.43f, 4.76f, 15.08f, 5.42f,
-CUBIC_TO, 15.74f, 6.07f, 16.26f, 6.83f, 16.64f, 7.71f,
-CUBIC_TO, 17.01f, 8.57f, 17.2f, 9.5f, 17.2f, 10.5f,
-CUBIC_TO, 17.2f, 11.49f, 17.01f, 12.42f, 16.64f, 13.29f,
-CUBIC_TO, 16.26f, 14.17f, 15.74f, 14.94f, 15.08f, 15.6f,
-CUBIC_TO, 14.43f, 16.25f, 13.67f, 16.76f, 12.79f, 17.14f,
-CUBIC_TO, 11.93f, 17.51f, 11, 17.7f, 10, 17.7f,
-CLOSE,
-MOVE_TO, 10, 16.35f,
-CUBIC_TO, 11.63f, 16.35f, 13.01f, 15.78f, 14.14f, 14.64f,
-CUBIC_TO, 15.28f, 13.51f, 15.85f, 12.13f, 15.85f, 10.5f,
-CUBIC_TO, 15.85f, 8.88f, 15.28f, 7.49f, 14.14f, 6.36f,
-CUBIC_TO, 13.01f, 5.22f, 11.63f, 4.65f, 10, 4.65f,
-CUBIC_TO, 8.38f, 4.65f, 6.99f, 5.22f, 5.86f, 6.36f,
-CUBIC_TO, 4.72f, 7.49f, 4.15f, 8.88f, 4.15f, 10.5f,
-CUBIC_TO, 4.15f, 12.13f, 4.72f, 13.51f, 5.86f, 14.64f,
-CUBIC_TO, 6.99f, 15.78f, 8.38f, 16.35f, 10, 16.35f,
-CLOSE,
-NEW_PATH
\ No newline at end of file
diff --git a/ash/resources/vector_icons/focus_mode_stop_circle.icon b/ash/resources/vector_icons/focus_mode_stop_circle.icon
deleted file mode 100644
index 9810ffc..0000000
--- a/ash/resources/vector_icons/focus_mode_stop_circle.icon
+++ /dev/null
@@ -1,40 +0,0 @@
-// 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.
-
-CANVAS_DIMENSIONS, 20,
-MOVE_TO, 7.3f, 12.7f,
-H_LINE_TO, 12.7f,
-V_LINE_TO, 7.3f,
-H_LINE_TO, 7.3f,
-V_LINE_TO, 12.7f,
-CLOSE,
-MOVE_TO, 10, 17.2f,
-CUBIC_TO, 9.01f, 17.2f, 8.08f, 17.01f, 7.21f, 16.64f,
-CUBIC_TO, 6.33f, 16.26f, 5.56f, 15.75f, 4.9f, 15.1f,
-CUBIC_TO, 4.25f, 14.44f, 3.74f, 13.67f, 3.36f, 12.79f,
-CUBIC_TO, 2.99f, 11.92f, 2.8f, 10.99f, 2.8f, 10,
-CUBIC_TO, 2.8f, 9, 2.99f, 8.07f, 3.36f, 7.21f,
-CUBIC_TO, 3.74f, 6.33f, 4.25f, 5.57f, 4.9f, 4.92f,
-CUBIC_TO, 5.56f, 4.26f, 6.33f, 3.74f, 7.21f, 3.36f,
-CUBIC_TO, 8.08f, 2.99f, 9.01f, 2.8f, 10, 2.8f,
-CUBIC_TO, 11, 2.8f, 11.93f, 2.99f, 12.79f, 3.36f,
-CUBIC_TO, 13.67f, 3.74f, 14.43f, 4.26f, 15.08f, 4.92f,
-CUBIC_TO, 15.74f, 5.57f, 16.26f, 6.33f, 16.64f, 7.21f,
-CUBIC_TO, 17.01f, 8.07f, 17.2f, 9, 17.2f, 10,
-CUBIC_TO, 17.2f, 10.99f, 17.01f, 11.92f, 16.64f, 12.79f,
-CUBIC_TO, 16.26f, 13.67f, 15.74f, 14.44f, 15.08f, 15.1f,
-CUBIC_TO, 14.43f, 15.75f, 13.67f, 16.26f, 12.79f, 16.64f,
-CUBIC_TO, 11.93f, 17.01f, 11, 17.2f, 10, 17.2f,
-CLOSE,
-MOVE_TO, 10, 15.85f,
-CUBIC_TO, 11.63f, 15.85f, 13.01f, 15.28f, 14.14f, 14.14f,
-CUBIC_TO, 15.28f, 13.01f, 15.85f, 11.63f, 15.85f, 10,
-CUBIC_TO, 15.85f, 8.38f, 15.28f, 6.99f, 14.14f, 5.86f,
-CUBIC_TO, 13.01f, 4.72f, 11.63f, 4.15f, 10, 4.15f,
-CUBIC_TO, 8.38f, 4.15f, 6.99f, 4.72f, 5.86f, 5.86f,
-CUBIC_TO, 4.72f, 6.99f, 4.15f, 8.38f, 4.15f, 10,
-CUBIC_TO, 4.15f, 11.63f, 4.72f, 13.01f, 5.86f, 14.14f,
-CUBIC_TO, 6.99f, 15.28f, 8.38f, 15.85f, 10, 15.85f,
-CLOSE,
-NEW_PATH
\ No newline at end of file
diff --git a/ash/system/focus_mode/focus_mode_controller.cc b/ash/system/focus_mode/focus_mode_controller.cc
index b31dfb5..1564dc70 100644
--- a/ash/system/focus_mode/focus_mode_controller.cc
+++ b/ash/system/focus_mode/focus_mode_controller.cc
@@ -440,7 +440,8 @@
   // TODO: Check that there is a selected playlist. Eventually we also want to
   // call CreateMediaWidget/CloseMediaWidget when a playlist is toggled during
   // a session.
-  if (focus_mode_sounds_controller_->selected_playlist() && !media_widget_) {
+  if (!focus_mode_sounds_controller_->selected_playlist().empty() &&
+      !media_widget_) {
     CreateMediaWidget();
   }
 
diff --git a/ash/system/focus_mode/focus_mode_util.h b/ash/system/focus_mode/focus_mode_util.h
index cc336d9..7e850d7 100644
--- a/ash/system/focus_mode/focus_mode_util.h
+++ b/ash/system/focus_mode/focus_mode_util.h
@@ -16,6 +16,19 @@
 
 namespace focus_mode_util {
 
+enum class SoundState {
+  kNone,      // The playlist is not selected and not playing.
+  kSelected,  // The playlist is selected but hasn't started playing.
+  kPaused,    // The playlist is selected but is paused during a focus session.
+  kPlaying,   // The playlist is selected and playing during a focus session.
+};
+
+enum class SoundType {
+  kNone,
+  kSoundscape,
+  kYouTubeMusic,
+};
+
 constexpr base::TimeDelta kMinimumDuration = base::Minutes(1);
 constexpr base::TimeDelta kMaximumDuration = base::Minutes(300);
 constexpr base::TimeDelta kEndingMomentDuration = base::Seconds(9);
diff --git a/ash/system/focus_mode/sounds/focus_mode_sounds_controller.cc b/ash/system/focus_mode/sounds/focus_mode_sounds_controller.cc
index 5c946ba..c0767d35 100644
--- a/ash/system/focus_mode/sounds/focus_mode_sounds_controller.cc
+++ b/ash/system/focus_mode/sounds/focus_mode_sounds_controller.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "ash/system/focus_mode/sounds/focus_mode_sounds_controller.h"
+
 #include <memory>
 
 #include "ash/public/cpp/image_downloader.h"
@@ -10,6 +11,7 @@
 #include "ash/shell.h"
 #include "ash/system/focus_mode/focus_mode_controller.h"
 #include "ash/system/focus_mode/focus_mode_util.h"
+#include "ash/system/focus_mode/sounds/playlist_view.h"
 #include "base/barrier_callback.h"
 #include "base/functional/bind.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
@@ -124,6 +126,17 @@
 
 }  // namespace
 
+FocusModeSoundsController::SelectedPlaylist::SelectedPlaylist() = default;
+
+FocusModeSoundsController::SelectedPlaylist::SelectedPlaylist(
+    const SelectedPlaylist&) = default;
+
+FocusModeSoundsController::SelectedPlaylist&
+FocusModeSoundsController::SelectedPlaylist::operator=(
+    const SelectedPlaylist& other) = default;
+
+FocusModeSoundsController::SelectedPlaylist::~SelectedPlaylist() = default;
+
 FocusModeSoundsController::FocusModeSoundsController() {
   soundscape_playlists_.reserve(kPlaylistNum);
   youtube_music_playlists_.reserve(kPlaylistNum);
@@ -131,6 +144,24 @@
 
 FocusModeSoundsController::~FocusModeSoundsController() = default;
 
+void FocusModeSoundsController::AddObserver(Observer* observer) {
+  observers_.AddObserver(observer);
+}
+
+void FocusModeSoundsController::RemoveObserver(Observer* observer) {
+  observers_.RemoveObserver(observer);
+}
+
+void FocusModeSoundsController::TogglePlaylist(
+    const SelectedPlaylist& playlist_data) {
+  if (playlist_data.state != focus_mode_util::SoundState::kNone) {
+    // When the user toggles a selected playlist, we will deselect it.
+    ResetSelectedPlaylist();
+  } else {
+    SelectPlaylist(playlist_data);
+  }
+}
+
 void FocusModeSoundsController::DownloadPlaylistsForType(
     const bool is_soundscape_type,
     UpdateSoundsViewCallback update_sounds_view_callback) {
@@ -159,6 +190,28 @@
   }
 }
 
+void FocusModeSoundsController::ResetSelectedPlaylist() {
+  // TODO: Stop the music for current selected playlist.
+  selected_playlist_ = {};
+  for (auto& observer : observers_) {
+    observer.OnSelectedPlaylistChanged();
+  }
+}
+
+void FocusModeSoundsController::SelectPlaylist(
+    const SelectedPlaylist& playlist_data) {
+  selected_playlist_ = playlist_data;
+
+  // TODO: If in an active focus session and toggling on a playlist, we should
+  // trigger the player to start playing and set the state as `kPlaying`
+  // instead.
+  selected_playlist_.state = focus_mode_util::SoundState::kSelected;
+
+  for (auto& observer : observers_) {
+    observer.OnSelectedPlaylistChanged();
+  }
+}
+
 void FocusModeSoundsController::OnOneThumbnailDownloaded(
     base::OnceCallback<void(std::unique_ptr<Playlist>)> barrier_callback,
     std::string id,
diff --git a/ash/system/focus_mode/sounds/focus_mode_sounds_controller.h b/ash/system/focus_mode/sounds/focus_mode_sounds_controller.h
index 2e561478..9e6e4915 100644
--- a/ash/system/focus_mode/sounds/focus_mode_sounds_controller.h
+++ b/ash/system/focus_mode/sounds/focus_mode_sounds_controller.h
@@ -9,6 +9,7 @@
 #include "ash/system/focus_mode/focus_mode_util.h"
 #include "base/functional/callback.h"
 #include "base/memory/weak_ptr.h"
+#include "base/observer_list.h"
 #include "ui/gfx/image/image_skia.h"
 
 namespace gfx {
@@ -38,6 +39,27 @@
     gfx::ImageSkia thumbnail;
   };
 
+  struct SelectedPlaylist {
+    SelectedPlaylist();
+    SelectedPlaylist(const SelectedPlaylist& other);
+    SelectedPlaylist& operator=(const SelectedPlaylist& other);
+    ~SelectedPlaylist();
+
+    bool empty() const { return id.empty(); }
+
+    std::string id;
+    std::string title;
+    gfx::ImageSkia thumbnail;
+    focus_mode_util::SoundType type = focus_mode_util::SoundType::kNone;
+    focus_mode_util::SoundState state = focus_mode_util::SoundState::kNone;
+  };
+
+  class Observer : public base::CheckedObserver {
+   public:
+    // Called when a playlist is toggled by the user on the focus panel.
+    virtual void OnSelectedPlaylistChanged() = 0;
+  };
+
   FocusModeSoundsController();
   FocusModeSoundsController(const FocusModeSoundsController&) = delete;
   FocusModeSoundsController& operator=(const FocusModeSoundsController&) =
@@ -52,7 +74,16 @@
     return youtube_music_playlists_;
   }
 
-  bool selected_playlist() const { return selected_playlist_; }
+  const SelectedPlaylist& selected_playlist() const {
+    return selected_playlist_;
+  }
+
+  void AddObserver(Observer* observer);
+  void RemoveObserver(Observer* observer);
+
+  // Toggles a playlist with the same id as the `playlist_data` to select or
+  // deselect based on its previous state.
+  void TogglePlaylist(const SelectedPlaylist& playlist_data);
 
   // Download images by providing urls. `update_sounds_view_callback` will be
   // called only when finishing downloading all non-empty thumbnails for the
@@ -64,6 +95,9 @@
       UpdateSoundsViewCallback update_sounds_view_callback);
 
  private:
+  void ResetSelectedPlaylist();
+  void SelectPlaylist(const SelectedPlaylist& playlist_data);
+
   // Invoked upon completion of the `thumbnail` download, `thumbnail` can be a
   // null image if the download attempt from the url failed.
   void OnOneThumbnailDownloaded(
@@ -79,8 +113,9 @@
   std::vector<std::unique_ptr<Playlist>> soundscape_playlists_;
   std::vector<std::unique_ptr<Playlist>> youtube_music_playlists_;
 
-  // TODO: Replace this with actual selected playlist information.
-  bool selected_playlist_ = false;
+  SelectedPlaylist selected_playlist_;
+
+  base::ObserverList<Observer> observers_;
 
   base::WeakPtrFactory<FocusModeSoundsController> weak_factory_{this};
 };
diff --git a/ash/system/focus_mode/sounds/focus_mode_sounds_view.cc b/ash/system/focus_mode/sounds/focus_mode_sounds_view.cc
index 7506e1f6..e848dfb 100644
--- a/ash/system/focus_mode/sounds/focus_mode_sounds_view.cc
+++ b/ash/system/focus_mode/sounds/focus_mode_sounds_view.cc
@@ -16,9 +16,11 @@
 #include "ash/style/typography.h"
 #include "ash/system/focus_mode/focus_mode_controller.h"
 #include "ash/system/focus_mode/focus_mode_detailed_view.h"
-#include "ash/system/focus_mode/sounds/focus_mode_sounds_controller.h"
+#include "ash/system/focus_mode/focus_mode_util.h"
+#include "ash/system/focus_mode/sounds/playlist_view.h"
 #include "ash/system/focus_mode/sounds/sound_section_view.h"
 #include "ash/system/model/system_tray_model.h"
+#include "base/check_op.h"
 #include "base/functional/bind.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
@@ -102,8 +104,10 @@
 
   CreateTabSliderButtons();
 
-  soundscape_container_ = AddChildView(std::make_unique<SoundSectionView>());
-  youtube_music_container_ = AddChildView(std::make_unique<SoundSectionView>());
+  soundscape_container_ = AddChildView(std::make_unique<SoundSectionView>(
+      focus_mode_util::SoundType::kSoundscape));
+  youtube_music_container_ = AddChildView(std::make_unique<SoundSectionView>(
+      focus_mode_util::SoundType::kYouTubeMusic));
 
   // TODO: Assume that the user doesn't have a premium account currently. Will
   // add a condition here when we finish the API implementation.
@@ -121,9 +125,22 @@
       /*is_soundscape_type=*/true,
       base::BindOnce(&FocusModeSoundsView::UpdateSoundsView,
                      weak_factory_.GetWeakPtr()));
+
+  sounds_controller->AddObserver(this);
 }
 
-FocusModeSoundsView::~FocusModeSoundsView() = default;
+FocusModeSoundsView::~FocusModeSoundsView() {
+  FocusModeController::Get()->focus_mode_sounds_controller()->RemoveObserver(
+      this);
+}
+
+void FocusModeSoundsView::OnSelectedPlaylistChanged() {
+  const auto& selected_playlist = FocusModeController::Get()
+                                      ->focus_mode_sounds_controller()
+                                      ->selected_playlist();
+  soundscape_container_->UpdateStateForSelectedPlaylist(selected_playlist);
+  youtube_music_container_->UpdateStateForSelectedPlaylist(selected_playlist);
+}
 
 void FocusModeSoundsView::UpdateSoundsView(bool is_soundscape_type) {
   auto* sounds_controller =
diff --git a/ash/system/focus_mode/sounds/focus_mode_sounds_view.h b/ash/system/focus_mode/sounds/focus_mode_sounds_view.h
index d59b248..e40cbc5 100644
--- a/ash/system/focus_mode/sounds/focus_mode_sounds_view.h
+++ b/ash/system/focus_mode/sounds/focus_mode_sounds_view.h
@@ -7,6 +7,7 @@
 
 #include "ash/ash_export.h"
 #include "ash/style/rounded_container.h"
+#include "ash/system/focus_mode/sounds/focus_mode_sounds_controller.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 
 namespace ash {
@@ -19,7 +20,9 @@
 // display two different types of music. Each playlist view will show a
 // thumbnail of the playlist cover, a title of the playlist and some media
 // control icons.
-class ASH_EXPORT FocusModeSoundsView : public RoundedContainer {
+class ASH_EXPORT FocusModeSoundsView
+    : public RoundedContainer,
+      public FocusModeSoundsController::Observer {
   METADATA_HEADER(FocusModeSoundsView, RoundedContainer)
 
  public:
@@ -28,8 +31,11 @@
   FocusModeSoundsView& operator=(const FocusModeSoundsView&) = delete;
   ~FocusModeSoundsView() override;
 
+  // FocusModeSoundsController::Observer:
+  void OnSelectedPlaylistChanged() override;
+
  private:
-  // Update this view based on `is_soundscape_type`.
+  // Updates this view based on `is_soundscape_type`.
   void UpdateSoundsView(bool is_soundscape_type);
 
   // Creates `soundscape_button_` and `youtube_music_button_`.
diff --git a/ash/system/focus_mode/sounds/playlist_image_button.cc b/ash/system/focus_mode/sounds/playlist_image_button.cc
index 843914f..9717687f 100644
--- a/ash/system/focus_mode/sounds/playlist_image_button.cc
+++ b/ash/system/focus_mode/sounds/playlist_image_button.cc
@@ -33,11 +33,6 @@
 }  // namespace
 
 PlaylistImageButton::PlaylistImageButton() {
-  // We want to show the stop icon or the equalizer animation for the mouse
-  // moving inside of or outside of this view when the playlist is playing.
-  // Thus, to let `OnMouseEntered` and `OnMouseExited` be triggered for the
-  // mouse event, we call the function here.
-  SetNotifyEnterExitOnChild(true);
   gfx::Size preferred_size(kSinglePlaylistViewWidth, kSinglePlaylistViewWidth);
   SetPreferredSize(preferred_size);
 
@@ -48,8 +43,6 @@
   image_view_ = AddChildView(std::make_unique<views::ImageView>());
   image_view_->SetImageSize(preferred_size);
 
-  media_action_icon_ = AddChildView(std::make_unique<views::ImageView>());
-
   selected_curvycutout_icon_ =
       AddChildView(std::make_unique<views::ImageView>());
   selected_curvycutout_icon_->SetImage(ui::ImageModel::FromVectorIcon(
@@ -60,22 +53,13 @@
   lottie_animation_view_->SetImageSize(gfx::Size(kIconSize, kIconSize));
   lottie_animation_view_->SetAnimatedImage(GetEqualizerAnimation());
 
+  SetIsSelected(false);
   SetIsPlaying(false);
   SetLayoutManager(std::make_unique<views::DelegatingLayoutManager>(this));
 }
 
 PlaylistImageButton::~PlaylistImageButton() = default;
 
-void PlaylistImageButton::OnMouseEntered(const ui::MouseEvent& event) {
-  Button::OnMouseEntered(event);
-  UpdateVisibility();
-}
-
-void PlaylistImageButton::OnMouseExited(const ui::MouseEvent& event) {
-  Button::OnMouseExited(event);
-  UpdateVisibility();
-}
-
 views::ProposedLayout PlaylistImageButton::CalculateProposedLayout(
     const views::SizeBounds& size_bounds) const {
   views::ProposedLayout layouts;
@@ -87,16 +71,11 @@
   layouts.child_layouts.emplace_back(image_view_.get(),
                                      image_view_->GetVisible(), bounds);
 
-  auto media_action_bounds =
+  layouts.child_layouts.emplace_back(
+      lottie_animation_view_.get(), lottie_animation_view_->GetVisible(),
       gfx::Rect(bounds.right() - kIconSize - kMediaActionIconSpacing,
                 bounds.bottom() - kIconSize - kMediaActionIconSpacing,
-                kIconSize, kIconSize);
-  layouts.child_layouts.emplace_back(media_action_icon_.get(),
-                                     media_action_icon_->GetVisible(),
-                                     media_action_bounds);
-  layouts.child_layouts.emplace_back(lottie_animation_view_.get(),
-                                     lottie_animation_view_->GetVisible(),
-                                     media_action_bounds);
+                kIconSize, kIconSize));
 
   layouts.child_layouts.emplace_back(
       selected_curvycutout_icon_.get(),
@@ -111,17 +90,16 @@
 void PlaylistImageButton::SetIsPlaying(bool is_playing) {
   is_playing_ = is_playing;
   is_playing_ ? lottie_animation_view_->Play() : lottie_animation_view_->Stop();
-  media_action_icon_->SetImage(ui::ImageModel::FromVectorIcon(
-      is_playing_ ? kFocusModeStopCircleIcon : kFocusModePlayCircleIcon,
-      SK_ColorWHITE, kIconSize));
-  UpdateVisibility();
+  lottie_animation_view_->SetVisible(is_playing_);
 }
 
-void PlaylistImageButton::UpdateContents(const gfx::ImageSkia& image,
-                                         PressedCallback callback) {
+void PlaylistImageButton::SetIsSelected(bool is_selected) {
+  selected_curvycutout_icon_->SetVisible(is_selected);
+}
+
+void PlaylistImageButton::UpdateContents(const gfx::ImageSkia& image) {
   SetEnabled(true);
   image_view_->SetImage(image);
-  SetCallback(std::move(callback));
 }
 
 void PlaylistImageButton::OnSetTooltipText(const std::u16string& tooltip_text) {
@@ -130,14 +108,6 @@
   image_view_->SetTooltipText(tooltip_text);
 }
 
-void PlaylistImageButton::UpdateVisibility() {
-  selected_curvycutout_icon_->SetVisible(is_playing_);
-
-  const bool is_animation_visible = is_playing_ && !IsMouseHovered();
-  lottie_animation_view_->SetVisible(is_animation_visible);
-  media_action_icon_->SetVisible(!is_animation_visible);
-}
-
 BEGIN_METADATA(PlaylistImageButton)
 END_METADATA
 
diff --git a/ash/system/focus_mode/sounds/playlist_image_button.h b/ash/system/focus_mode/sounds/playlist_image_button.h
index 596d553a..a98d322 100644
--- a/ash/system/focus_mode/sounds/playlist_image_button.h
+++ b/ash/system/focus_mode/sounds/playlist_image_button.h
@@ -31,10 +31,6 @@
   PlaylistImageButton& operator=(const PlaylistImageButton&) = delete;
   ~PlaylistImageButton() override;
 
-  // views::Button:
-  void OnMouseEntered(const ui::MouseEvent& event) override;
-  void OnMouseExited(const ui::MouseEvent& event) override;
-
   // views::LayoutDelegate:
   views::ProposedLayout CalculateProposedLayout(
       const views::SizeBounds& size_bounds) const override;
@@ -43,19 +39,18 @@
   // state.
   void SetIsPlaying(bool is_playing);
 
-  // Replaces the `image_view_` with a new image and the press callback for a
-  // new playlist.
-  void UpdateContents(const gfx::ImageSkia& image, PressedCallback callback);
+  // Called when this view is pressed to show/hide `selected_curvycutout_icon_`.
+  void SetIsSelected(bool is_selected);
+
+  // Replaces the `image_view_` with a new image.
+  void UpdateContents(const gfx::ImageSkia& image);
 
  private:
   // views::Button:
   void OnSetTooltipText(const std::u16string& tooltip_text) override;
 
-  void UpdateVisibility();
-
   bool is_playing_ = false;
   raw_ptr<views::ImageView> image_view_ = nullptr;
-  raw_ptr<views::ImageView> media_action_icon_ = nullptr;
   raw_ptr<views::ImageView> selected_curvycutout_icon_ = nullptr;
   raw_ptr<views::AnimatedImageView> lottie_animation_view_ = nullptr;
 };
diff --git a/ash/system/focus_mode/sounds/playlist_view.cc b/ash/system/focus_mode/sounds/playlist_view.cc
new file mode 100644
index 0000000..18da31f
--- /dev/null
+++ b/ash/system/focus_mode/sounds/playlist_view.cc
@@ -0,0 +1,93 @@
+// 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/system/focus_mode/sounds/playlist_view.h"
+
+#include "ash/style/typography.h"
+#include "ash/system/focus_mode/focus_mode_controller.h"
+#include "ash/system/focus_mode/focus_mode_util.h"
+#include "ash/system/focus_mode/sounds/focus_mode_sounds_controller.h"
+#include "ash/system/focus_mode/sounds/playlist_image_button.h"
+#include "base/functional/bind.h"
+#include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
+#include "ui/views/controls/label.h"
+
+namespace ash {
+namespace {
+
+constexpr int kSinglePlaylistViewWidth = 72;
+constexpr int kSinglePlaylistViewSpacingBetweenChild = 10;
+constexpr int kPlaylistTitleLineHeight = 10;
+
+}  // namespace
+
+PlaylistView::PlaylistView(focus_mode_util::SoundType type,
+                           TogglePlaylistCallback toggle_playlist_callback)
+    : toggle_playlist_callback_(std::move(toggle_playlist_callback)) {
+  playlist_data_.type = type;
+
+  SetOrientation(views::BoxLayout::Orientation::kVertical);
+  SetMainAxisAlignment(views::BoxLayout::MainAxisAlignment::kCenter);
+  SetBetweenChildSpacing(kSinglePlaylistViewSpacingBetweenChild);
+
+  playlist_image_button_ =
+      AddChildView(std::make_unique<PlaylistImageButton>());
+
+  playlist_image_button_->SetCallback(base::BindRepeating(
+      &PlaylistView::OnPlaylistViewToggled, base::Unretained(this)));
+
+  title_label_ = AddChildView(std::make_unique<views::Label>());
+  title_label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_CENTER);
+  title_label_->SetMaximumWidthSingleLine(kSinglePlaylistViewWidth);
+  title_label_->SetFontList(TypographyProvider::Get()->ResolveTypographyToken(
+      TypographyToken::kCrosLabel1));
+  title_label_->SetEnabledColorId(cros_tokens::kCrosSysSecondary);
+  title_label_->SetLineHeight(kPlaylistTitleLineHeight);
+}
+
+PlaylistView::~PlaylistView() = default;
+
+void PlaylistView::UpdateContents(
+    const FocusModeSoundsController::Playlist& playlist) {
+  playlist_data_.id = playlist.playlist_id;
+  playlist_data_.title = playlist.title;
+  playlist_data_.thumbnail = playlist.thumbnail;
+
+  const auto text = base::UTF8ToUTF16(playlist_data_.title);
+  title_label_->SetText(text);
+  title_label_->SetTooltipText(text);
+  playlist_image_button_->SetTooltipText(text);
+  playlist_image_button_->UpdateContents(playlist_data_.thumbnail);
+}
+
+void PlaylistView::SetState(focus_mode_util::SoundState state) {
+  playlist_data_.state = state;
+  switch (state) {
+    case focus_mode_util::SoundState::kNone:
+      playlist_image_button_->SetIsSelected(false);
+      playlist_image_button_->SetIsPlaying(false);
+      break;
+    case focus_mode_util::SoundState::kSelected:
+    case focus_mode_util::SoundState::kPaused:
+      playlist_image_button_->SetIsSelected(true);
+      playlist_image_button_->SetIsPlaying(false);
+      break;
+    case focus_mode_util::SoundState::kPlaying:
+      playlist_image_button_->SetIsSelected(true);
+      playlist_image_button_->SetIsPlaying(true);
+      break;
+  }
+}
+
+void PlaylistView::OnPlaylistViewToggled() {
+  CHECK(toggle_playlist_callback_);
+  CHECK(!playlist_data_.empty());
+  toggle_playlist_callback_.Run(playlist_data_);
+}
+
+BEGIN_METADATA(PlaylistView)
+END_METADATA
+
+}  // namespace ash
diff --git a/ash/system/focus_mode/sounds/playlist_view.h b/ash/system/focus_mode/sounds/playlist_view.h
new file mode 100644
index 0000000..a1f6542
--- /dev/null
+++ b/ash/system/focus_mode/sounds/playlist_view.h
@@ -0,0 +1,55 @@
+// 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_SYSTEM_FOCUS_MODE_SOUNDS_PLAYLIST_VIEW_H_
+#define ASH_SYSTEM_FOCUS_MODE_SOUNDS_PLAYLIST_VIEW_H_
+
+#include "ash/ash_export.h"
+#include "ash/system/focus_mode/focus_mode_util.h"
+#include "ash/system/focus_mode/sounds/focus_mode_sounds_controller.h"
+#include "ash/system/focus_mode/sounds/sound_section_view.h"
+#include "ui/views/layout/box_layout_view.h"
+
+namespace views {
+class Label;
+}
+
+namespace ash {
+
+class PlaylistImageButton;
+
+class ASH_EXPORT PlaylistView : public views::BoxLayoutView {
+  METADATA_HEADER(PlaylistView, views::BoxLayoutView)
+
+ public:
+  using TogglePlaylistCallback = base::RepeatingCallback<void(
+      const FocusModeSoundsController::SelectedPlaylist& playlist_data)>;
+
+  PlaylistView(focus_mode_util::SoundType type,
+               TogglePlaylistCallback toggle_playlist_callback);
+  PlaylistView(const PlaylistView&) = delete;
+  PlaylistView& operator=(const PlaylistView&) = delete;
+  ~PlaylistView() override;
+
+  const FocusModeSoundsController::SelectedPlaylist& playlist_data() {
+    return playlist_data_;
+  }
+
+  void UpdateContents(const FocusModeSoundsController::Playlist& playlist);
+  void SetState(focus_mode_util::SoundState state);
+
+ private:
+  // Called when the `playlist_image_button_` is toggled by the user.
+  void OnPlaylistViewToggled();
+
+  raw_ptr<views::Label> title_label_ = nullptr;
+  raw_ptr<PlaylistImageButton> playlist_image_button_ = nullptr;
+  FocusModeSoundsController::SelectedPlaylist playlist_data_;
+
+  TogglePlaylistCallback toggle_playlist_callback_;
+};
+
+}  // namespace ash
+
+#endif  // ASH_SYSTEM_FOCUS_MODE_SOUNDS_PLAYLIST_VIEW_H_
diff --git a/ash/system/focus_mode/sounds/sound_section_view.cc b/ash/system/focus_mode/sounds/sound_section_view.cc
index 996a154..3e5d756 100644
--- a/ash/system/focus_mode/sounds/sound_section_view.cc
+++ b/ash/system/focus_mode/sounds/sound_section_view.cc
@@ -5,12 +5,15 @@
 #include "ash/system/focus_mode/sounds/sound_section_view.h"
 
 #include "ash/strings/grit/ash_strings.h"
-#include "ash/style/typography.h"
-#include "ash/system/focus_mode/sounds/playlist_image_button.h"
+#include "ash/system/focus_mode/focus_mode_controller.h"
+#include "ash/system/focus_mode/focus_mode_util.h"
+#include "ash/system/focus_mode/sounds/focus_mode_sounds_controller.h"
+#include "ash/system/focus_mode/sounds/focus_mode_sounds_view.h"
+#include "ash/system/focus_mode/sounds/playlist_view.h"
+#include "base/functional/bind.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
-#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
-#include "ui/views/controls/label.h"
+#include "ui/views/border.h"
 #include "ui/views/layout/box_layout_view.h"
 #include "ui/views/layout/flex_layout_view.h"
 #include "ui/views/view_utils.h"
@@ -21,9 +24,6 @@
 
 constexpr int kPlaylistViewsNum = 4;
 constexpr auto kPlaylistsContainerViewInsets = gfx::Insets::VH(0, 24);
-constexpr int kSinglePlaylistViewWidth = 72;
-constexpr int kSinglePlaylistViewSpacingBetweenChild = 10;
-constexpr int kPlaylistTitleLineHeight = 10;
 
 std::unique_ptr<views::View> CreateSpacerView() {
   auto spacer_view = std::make_unique<views::View>();
@@ -34,59 +34,13 @@
   return spacer_view;
 }
 
-//---------------------------------------------------------------------
-// PlaylistView:
-
-class PlaylistView : public views::BoxLayoutView {
-  METADATA_HEADER(PlaylistView, views::BoxLayoutView)
-
- public:
-  PlaylistView() {
-    SetOrientation(views::BoxLayout::Orientation::kVertical);
-    SetMainAxisAlignment(views::BoxLayout::MainAxisAlignment::kCenter);
-    SetBetweenChildSpacing(kSinglePlaylistViewSpacingBetweenChild);
-
-    thumbnail_view_ = AddChildView(std::make_unique<PlaylistImageButton>());
-
-    title_label_ = AddChildView(std::make_unique<views::Label>());
-    title_label_->SetHorizontalAlignment(
-        gfx::HorizontalAlignment::ALIGN_CENTER);
-    title_label_->SetMaximumWidthSingleLine(kSinglePlaylistViewWidth);
-    title_label_->SetFontList(TypographyProvider::Get()->ResolveTypographyToken(
-        TypographyToken::kCrosLabel1));
-    title_label_->SetEnabledColorId(cros_tokens::kCrosSysSecondary);
-    title_label_->SetLineHeight(kPlaylistTitleLineHeight);
-  }
-
-  const std::string& playlist_id() const { return playlist_id_; }
-
-  void UpdateContents(
-      const FocusModeSoundsController::Playlist* playlist_data) {
-    playlist_id_ = playlist_data->playlist_id;
-    const auto text = base::UTF8ToUTF16(playlist_data->title);
-    title_label_->SetText(text);
-    title_label_->SetTooltipText(text);
-    thumbnail_view_->SetTooltipText(text);
-    // TODO: Use a non-empty callback for the `PlaylistImageButton`.
-    thumbnail_view_->UpdateContents(playlist_data->thumbnail,
-                                    views::Button::PressedCallback());
-  }
-
- private:
-  std::string playlist_id_;
-  raw_ptr<views::Label> title_label_ = nullptr;
-  raw_ptr<PlaylistImageButton> thumbnail_view_ = nullptr;
-};
-
-BEGIN_METADATA(PlaylistView)
-END_METADATA
-
 }  // namespace
 
 //---------------------------------------------------------------------
 // SoundSectionView:
 
-SoundSectionView::SoundSectionView() {
+SoundSectionView::SoundSectionView(focus_mode_util::SoundType type)
+    : type_(type) {
   SetMainAxisAlignment(views::LayoutAlignment::kCenter);
   SetCrossAxisAlignment(views::LayoutAlignment::kCenter);
   SetOrientation(views::LayoutOrientation::kHorizontal);
@@ -95,7 +49,7 @@
                  views::MinimumFlexSizeRule::kScaleToMinimumSnapToZero,
                  views::MaximumFlexSizeRule::kUnbounded));
 
-  CreatePlaylistViewsContainer();
+  CreatePlaylistViewsContainer(type);
 }
 
 SoundSectionView::~SoundSectionView() = default;
@@ -108,10 +62,13 @@
 
   for (size_t i = 0; i < kPlaylistViewsNum; ++i) {
     const auto& playlist_data = data.at(i);
-    auto* playlist_view =
-        views::AsViewClass<PlaylistView>(playlist_view_list_.at(i));
-    playlist_view->UpdateContents(playlist_data.get());
+    auto* playlist_view = playlist_view_list_.at(i);
+    playlist_view->UpdateContents(*playlist_data);
   }
+
+  UpdateStateForSelectedPlaylist(FocusModeController::Get()
+                                     ->focus_mode_sounds_controller()
+                                     ->selected_playlist());
 }
 
 void SoundSectionView::ShowAlternateView(bool show_alternate_view) {
@@ -127,7 +84,20 @@
   alternate_view_ = AddChildView(std::move(alternate_view));
 }
 
-void SoundSectionView::CreatePlaylistViewsContainer() {
+void SoundSectionView::UpdateStateForSelectedPlaylist(
+    const FocusModeSoundsController::SelectedPlaylist& selected_playlist) {
+  for (auto* playlist_view : playlist_view_list_) {
+    if (!selected_playlist.empty() && selected_playlist.type == type_ &&
+        selected_playlist.id == playlist_view->playlist_data().id) {
+      playlist_view->SetState(selected_playlist.state);
+    } else {
+      playlist_view->SetState(focus_mode_util::SoundState::kNone);
+    }
+  }
+}
+
+void SoundSectionView::CreatePlaylistViewsContainer(
+    focus_mode_util::SoundType type) {
   playlist_views_container_ =
       AddChildView(std::make_unique<views::BoxLayoutView>());
   playlist_views_container_->SetOrientation(
@@ -143,8 +113,17 @@
           playlist_views_container_->AddChildView(CreateSpacerView());
       playlist_views_container_->SetFlexForView(spacer_view, 1);
     }
-    playlist_view_list_.push_back(playlist_views_container_->AddChildView(
-        std::make_unique<PlaylistView>()));
+
+    // `FocusModeSoundsController` is owned by `FocusModeController` which
+    // outlives `PlaylistView`, because `FocusModeController` is destroyed after
+    // the call of `CloseAllRootWindowChildWindows` in the dtor of `Shell`.
+    playlist_view_list_.push_back(
+        playlist_views_container_->AddChildView(std::make_unique<PlaylistView>(
+            type,
+            base::BindRepeating(
+                &FocusModeSoundsController::TogglePlaylist,
+                base::Unretained(FocusModeController::Get()
+                                     ->focus_mode_sounds_controller())))));
   }
 }
 
diff --git a/ash/system/focus_mode/sounds/sound_section_view.h b/ash/system/focus_mode/sounds/sound_section_view.h
index 025170c..1d0fa97b 100644
--- a/ash/system/focus_mode/sounds/sound_section_view.h
+++ b/ash/system/focus_mode/sounds/sound_section_view.h
@@ -6,6 +6,7 @@
 #define ASH_SYSTEM_FOCUS_MODE_SOUNDS_SOUND_SECTION_VIEW_H_
 
 #include "ash/ash_export.h"
+#include "ash/system/focus_mode/focus_mode_util.h"
 #include "ash/system/focus_mode/sounds/focus_mode_sounds_controller.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/views/layout/flex_layout_view.h"
@@ -16,11 +17,8 @@
 
 namespace ash {
 
-namespace {
-class PlaylistView;
-}  // namespace
-
 class PillButton;
+class PlaylistView;
 
 // These are views that represent a list of playlists and we toggle between
 // `Focus Sounds` or `YouTube Music` sound sections using the slider button in
@@ -30,12 +28,12 @@
   METADATA_HEADER(SoundSectionView, views::FlexLayoutView)
 
  public:
-  SoundSectionView();
+  explicit SoundSectionView(focus_mode_util::SoundType type);
   SoundSectionView(const SoundSectionView&) = delete;
   SoundSectionView& operator=(const SoundSectionView&) = delete;
   ~SoundSectionView() override;
 
-  // Update the contents in `playlist_view_list_`, e.g. the image view, title,
+  // Updates the contents in `playlist_view_list_`, e.g. the image view, title,
   // id of a playlist.
   void UpdateContents(
       const std::vector<std::unique_ptr<FocusModeSoundsController::Playlist>>&
@@ -46,9 +44,13 @@
   void ShowAlternateView(bool show_alternate_view);
   void SetAlternateView(std::unique_ptr<views::BoxLayoutView> alternate_view);
 
- protected:
-  void CreatePlaylistViewsContainer();
+  void UpdateStateForSelectedPlaylist(
+      const FocusModeSoundsController::SelectedPlaylist& selected_playlist);
 
+ private:
+  void CreatePlaylistViewsContainer(focus_mode_util::SoundType type);
+
+  const focus_mode_util::SoundType type_;
   std::vector<PlaylistView*> playlist_view_list_;
   raw_ptr<views::BoxLayoutView> playlist_views_container_ = nullptr;
 
@@ -56,8 +58,9 @@
   // will not be populated. For this case, we will set an alternate view (e.g. a
   // non-premium view defined in `FocusModeSoundsView`) and show it instead.
   raw_ptr<views::BoxLayoutView> alternate_view_ = nullptr;
-
   raw_ptr<PillButton> learn_more_button_ = nullptr;
+
+  base::WeakPtrFactory<SoundSectionView> weak_factory_{this};
 };
 
 }  // namespace ash
diff --git a/base/allocator/partition_allocator/partition_alloc.gni b/base/allocator/partition_allocator/partition_alloc.gni
index f421a01..a4697dd5 100644
--- a/base/allocator/partition_allocator/partition_alloc.gni
+++ b/base/allocator/partition_allocator/partition_alloc.gni
@@ -215,7 +215,7 @@
   enable_backup_ref_ptr_instance_tracer = false
 
   backup_ref_ptr_extra_oob_checks =
-      false && enable_backup_ref_ptr_support && use_raw_ptr_backup_ref_impl
+      enable_backup_ref_ptr_support && use_raw_ptr_backup_ref_impl
 }
 
 declare_args() {
diff --git a/build/toolchain/goma.gni b/build/toolchain/goma.gni
index 3acdfa3..0beb1e0 100644
--- a/build/toolchain/goma.gni
+++ b/build/toolchain/goma.gni
@@ -4,8 +4,6 @@
 
 # Defines the configuration of Goma.
 
-import("//build/toolchain/siso.gni")
-
 declare_args() {
   # Set to true to enable distributed compilation using Goma.
   use_goma = false
@@ -14,38 +12,9 @@
   goma_dir = ""
 }
 
-if (use_goma && goma_dir == "") {
-  goma_dir = exec_script("get_goma_dir.py", [], "string")
-}
-
-assert(!is_win || !use_goma || is_clang,
-       "cl.exe does not work on goma, use clang")
-
 # TODO(b/41489832): remove this after goma shutdown.
 assert(
-    !use_goma || target_os == "chromeos",
-    "use_goma can only be used for ChromeOS build now." +
+    !use_goma,
+    "use_goma cannot be used for Chrome build now." +
         " Use use_remoteexec=true instead for other build." +
         " See build instructions from " + "https://source.chromium.org/search?q=%22Use%20Reclient%22&ss=chromium%2Fchromium%2Fsrc:docs%2F")
-
-if (use_goma && current_toolchain == default_toolchain) {
-  if (host_os == "win") {
-    print("The gn arg use_goma=true will be deprecated by EOY 2023. " +
-          "Please use `use_remoteexec=true` instead. See " +
-          "https://chromium.googlesource.com/chromium/src/+/main/docs/" +
-          "windows_build_instructions.md#use-reclient " +
-          "for setup instructions.")
-  } else if (host_os == "mac") {
-    print("The gn arg use_goma=true will be deprecated by EOY 2023. " +
-          "Please use `use_remoteexec=true` instead. " +
-          "If you are a googler see http://go/building-chrome-mac" +
-          "#using-remote-execution for setup instructions.")
-  } else {
-    print("The gn arg use_goma=true will be deprecated by EOY 2023. " +
-          "Please use `use_remoteexec=true` instead. See " +
-          "https://chromium.googlesource.com/chromium/src/+/main/docs/" +
-          "linux/build_instructions.md#use-reclient for setup instructions.")
-  }
-  assert(!use_siso,
-         "Siso does not support Goma. Use use_remoteexec=true instead.")
-}
diff --git a/cc/paint/paint_op.cc b/cc/paint/paint_op.cc
index 3d10b00..8b83b492 100644
--- a/cc/paint/paint_op.cc
+++ b/cc/paint/paint_op.cc
@@ -2059,9 +2059,19 @@
 
 // static
 bool PaintOp::GetBounds(const PaintOp& op, SkRect* rect) {
-  DCHECK(op.IsDrawOp());
-
   switch (op.GetType()) {
+    case PaintOpType::kAnnotate:
+      return false;
+    case PaintOpType::kClipPath:
+      return false;
+    case PaintOpType::kClipRect:
+      return false;
+    case PaintOpType::kClipRRect:
+      return false;
+    case PaintOpType::kConcat:
+      return false;
+    case PaintOpType::kCustomData:
+      return false;
     case PaintOpType::kDrawColor:
       return false;
     case PaintOpType::kDrawDRRect: {
@@ -2095,6 +2105,12 @@
       rect->sort();
       return true;
     }
+    case PaintOpType::kDrawLineLite: {
+      const auto& line_op = static_cast<const DrawLineLiteOp&>(op);
+      rect->setLTRB(line_op.x0, line_op.y0, line_op.x1, line_op.y1);
+      rect->sort();
+      return true;
+    }
     case PaintOpType::kDrawArc: {
       const auto& arc_op = static_cast<const DrawArcOp&>(op);
       *rect = arc_op.oval;
@@ -2160,8 +2176,28 @@
           base::checked_cast<int>(vertices_op.vertices->data().size()));
       return true;
     }
-    default:
-      NOTREACHED_IN_MIGRATION();
+    case PaintOpType::kNoop:
+      return false;
+    case PaintOpType::kRestore:
+      return false;
+    case PaintOpType::kRotate:
+      return false;
+    case PaintOpType::kSave:
+      return false;
+    case PaintOpType::kSaveLayer:
+      return false;
+    case PaintOpType::kSaveLayerAlpha:
+      return false;
+    case PaintOpType::kSaveLayerFilters:
+      return false;
+    case PaintOpType::kScale:
+      return false;
+    case PaintOpType::kSetMatrix:
+      return false;
+    case PaintOpType::kSetNodeId:
+      return false;
+    case PaintOpType::kTranslate:
+      return false;
   }
   return false;
 }
@@ -2172,7 +2208,7 @@
                                     const SkMatrix& ctm) {
   gfx::Rect transformed_rect;
   SkRect op_rect;
-  if (!op.IsDrawOp() || !PaintOp::GetBounds(op, &op_rect)) {
+  if (!PaintOp::GetBounds(op, &op_rect)) {
     // If we can't provide a conservative bounding rect for the op, assume it
     // covers the complete current clip.
     // TODO(khushalsagar): See if we can do something better for non-draw ops.
diff --git a/chrome/VERSION b/chrome/VERSION
index da27972..c6f065be 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=127
 MINOR=0
-BUILD=6479
+BUILD=6480
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 8c12c3c0..75dbd9c 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -3767,7 +3767,6 @@
     "java/src/org/chromium/chrome/browser/password_manager/Credential.java",
     "java/src/org/chromium/chrome/browser/password_manager/CredentialLeakDialogBridge.java",
     "java/src/org/chromium/chrome/browser/password_manager/PasswordCheckupLauncher.java",
-    "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogBridge.java",
     "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationPopupBridge.java",
     "java/src/org/chromium/chrome/browser/password_manager/PasswordManagerErrorMessageHelperBridge.java",
     "java/src/org/chromium/chrome/browser/password_manager/PasswordManagerLauncher.java",
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
index 62a85aa..df2019d0 100644
--- a/chrome/android/chrome_java_resources.gni
+++ b/chrome/android/chrome_java_resources.gni
@@ -540,7 +540,6 @@
   "java/res/layout/os_version_unsupported_text.xml",
   "java/res/layout/other_forms_of_history_dialog.xml",
   "java/res/layout/page_insights_hub_container.xml",
-  "java/res/layout/password_generation_dialog.xml",
   "java/res/layout/password_generation_popup_explanation.xml",
   "java/res/layout/password_manager_dialog.xml",
   "java/res/layout/password_manager_dialog_with_help_button.xml",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 5e62906..a55aae0 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -897,12 +897,6 @@
   "java/src/org/chromium/chrome/browser/password_manager/CredentialLeakDialogBridge.java",
   "java/src/org/chromium/chrome/browser/password_manager/GooglePasswordManagerUIProvider.java",
   "java/src/org/chromium/chrome/browser/password_manager/PasswordCheckupLauncher.java",
-  "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogBridge.java",
-  "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCoordinator.java",
-  "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCustomView.java",
-  "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogMediator.java",
-  "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogModel.java",
-  "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogViewBinder.java",
   "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationPopupAdapter.java",
   "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationPopupBridge.java",
   "java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogContents.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 9a3a25e..52bab484 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -310,7 +310,6 @@
   "javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerDisableIncognitoModeIntegrationTest.java",
   "javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java",
   "javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageUnitTest.java",
-  "javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java",
   "javatests/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogTest.java",
   "javatests/src/org/chromium/chrome/browser/password_manager/PasswordMigrationWarningExportFlowTest.java",
   "javatests/src/org/chromium/chrome/browser/password_manager/PasswordSavingIntegrationTest.java",
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java
index d6f3e4e..a7b57b1 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.keyboard_accessory;
 
-import static androidx.test.espresso.Espresso.onView;
 import static androidx.test.espresso.action.ViewActions.click;
 import static androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition;
 import static androidx.test.espresso.matcher.ViewMatchers.withId;
@@ -18,7 +17,6 @@
 
 import android.os.Build.VERSION_CODES;
 import android.view.View;
-import android.view.Window;
 import android.widget.TextView;
 
 import androidx.recyclerview.widget.RecyclerView;
@@ -43,7 +41,6 @@
 import org.chromium.base.test.util.Matchers;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.keyboard_accessory.button_group_component.KeyboardAccessoryButtonGroupView;
@@ -57,20 +54,17 @@
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerProvider;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetTestSupport;
-import org.chromium.components.browser_ui.modaldialog.AppModalPresenter;
 import org.chromium.components.messages.MessagesTestHelper;
 import org.chromium.content_public.browser.test.util.DOMUtils;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.net.test.EmbeddedTestServer;
 import org.chromium.net.test.ServerCertificate;
 import org.chromium.ui.base.WindowAndroid;
-import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.test.util.GmsCoreVersionRestriction;
 import org.chromium.ui.widget.ChromeImageButton;
 
 import java.util.ArrayList;
 import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicReference;
 
 /** Integration tests for password generation. */
 @RunWith(ChromeJUnit4ClassRunner.class)
@@ -151,13 +145,13 @@
     public void testAutomaticGenerationCancel() throws InterruptedException, TimeoutException {
         waitForGenerationLabel();
         focusField(PASSWORD_NODE_ID);
-        dismissBottomSheetIfNeeded();
+        dismissBottomSheet();
         // Focus again, because the sheet steals the focus from web contents.
         focusField(PASSWORD_NODE_ID);
         mHelper.waitForKeyboardAccessoryToBeShown(true);
         whenDisplayed(withId(R.id.bar_items_view)).perform(actionOnItemAtPosition(0, click()));
-        waitForGenerationDialog();
-        rejectPasswordInGenerationDialog();
+        BottomSheetTestSupport.waitForOpen(mBottomSheetController);
+        rejectPasswordInGenerationBottomSheet();
         assertPasswordTextEmpty(PASSWORD_NODE_ID);
         assertNoInfobarsAreShown();
         CriteriaHelper.pollUiThread(
@@ -178,8 +172,8 @@
         mHelper.waitForKeyboardAccessoryToBeShown();
         toggleAccessorySheet();
         pressManualGenerationSuggestion();
-        waitForGenerationDialog();
-        rejectPasswordInGenerationDialog();
+        BottomSheetTestSupport.waitForOpen(mBottomSheetController);
+        rejectPasswordInGenerationBottomSheet();
         assertPasswordTextEmpty(PASSWORD_NODE_ID_MANUAL);
         assertNoInfobarsAreShown();
         CriteriaHelper.pollUiThread(
@@ -197,13 +191,13 @@
     public void testAutomaticGenerationUsePassword() throws InterruptedException, TimeoutException {
         waitForGenerationLabel();
         focusField(PASSWORD_NODE_ID);
-        dismissBottomSheetIfNeeded();
+        dismissBottomSheet();
         // Focus again, because the sheet steals the focus from web contents.
         focusField(PASSWORD_NODE_ID);
         mHelper.waitForKeyboardAccessoryToBeShown(true);
         whenDisplayed(withId(R.id.bar_items_view)).perform(actionOnItemAtPosition(0, click()));
-        waitForGenerationDialog();
-        String generatedPassword = acceptPasswordInGenerationDialog();
+        BottomSheetTestSupport.waitForOpen(mBottomSheetController);
+        String generatedPassword = acceptPasswordInGenerationBottomSheet();
         CriteriaHelper.pollInstrumentationThread(
                 () -> !mHelper.getFieldText(PASSWORD_NODE_ID).isEmpty());
         assertPasswordText(PASSWORD_NODE_ID, generatedPassword);
@@ -230,8 +224,8 @@
         mHelper.waitForKeyboardAccessoryToBeShown();
         toggleAccessorySheet();
         pressManualGenerationSuggestion();
-        waitForGenerationDialog();
-        String generatedPassword = acceptPasswordInGenerationDialog();
+        BottomSheetTestSupport.waitForOpen(mBottomSheetController);
+        String generatedPassword = acceptPasswordInGenerationBottomSheet();
         CriteriaHelper.pollInstrumentationThread(
                 () -> !mHelper.getFieldText(PASSWORD_NODE_ID_MANUAL).isEmpty());
         assertPasswordText(PASSWORD_NODE_ID_MANUAL, generatedPassword);
@@ -331,37 +325,6 @@
                 });
     }
 
-    private void waitForGenerationDialog() {
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.PASSWORD_GENERATION_BOTTOM_SHEET)) {
-            BottomSheetTestSupport.waitForOpen(mBottomSheetController);
-            return;
-        }
-        waitForModalDialogPresenter();
-        ModalDialogManager manager =
-                TestThreadUtils.runOnUiThreadBlockingNoException(
-                        mSyncTestRule.getActivity()::getModalDialogManager);
-        CriteriaHelper.pollUiThread(
-                () -> {
-                    Window window =
-                            ((AppModalPresenter) manager.getCurrentPresenterForTest()).getWindow();
-                    mGeneratedPasswordTextView =
-                            window.getDecorView()
-                                    .getRootView()
-                                    .findViewById(R.id.generated_password);
-                    return mGeneratedPasswordTextView != null;
-                });
-    }
-
-    private void waitForModalDialogPresenter() {
-        CriteriaHelper.pollUiThread(
-                () ->
-                        mSyncTestRule
-                                        .getActivity()
-                                        .getModalDialogManager()
-                                        .getCurrentPresenterForTest()
-                                != null);
-    }
-
     private void assertNoInfobarsAreShown() {
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> {
@@ -371,13 +334,6 @@
                 });
     }
 
-    private static String getTextFromTextView(int id) {
-        AtomicReference<String> textRef = new AtomicReference<>();
-        onView(withId(id))
-                .check((view, error) -> textRef.set(((TextView) view).getText().toString()));
-        return textRef.get();
-    }
-
     private void waitForMessageShown() {
         WindowAndroid window = mSyncTestRule.getActivity().getWindowAndroid();
         CriteriaHelper.pollUiThread(
@@ -389,28 +345,7 @@
                 });
     }
 
-    private void rejectPasswordInGenerationDialog() {
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.PASSWORD_GENERATION_BOTTOM_SHEET)) {
-            rejectPasswordInGenerationBottomSheet();
-        } else {
-            onView(withId(R.id.negative_button)).perform(click());
-        }
-    }
-
-    private String acceptPasswordInGenerationDialog() {
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.PASSWORD_GENERATION_BOTTOM_SHEET)) {
-            return acceptPasswordInGenerationBottomSheet();
-        } else {
-            String generatedPassword = getTextFromTextView(R.id.generated_password);
-            onView(withId(R.id.positive_button)).perform(click());
-            return generatedPassword;
-        }
-    }
-
-    private void dismissBottomSheetIfNeeded() {
-        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.PASSWORD_GENERATION_BOTTOM_SHEET)) {
-            return;
-        }
+    private void dismissBottomSheet() {
         BottomSheetTestSupport.waitForOpen(mBottomSheetController);
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> {
diff --git a/chrome/android/java/res/layout/password_generation_dialog.xml b/chrome/android/java/res/layout/password_generation_dialog.xml
deleted file mode 100644
index b312e172..0000000
--- a/chrome/android/java/res/layout/password_generation_dialog.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright 2018 The Chromium Authors
-Use of this source code is governed by a BSD-style license that can be
-found in the LICENSE file.
--->
-
-<org.chromium.chrome.browser.password_manager.PasswordGenerationDialogCustomView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingStart="@dimen/password_generation_dialog_padding"
-    android:paddingEnd="@dimen/password_generation_dialog_padding"
-    android:paddingTop="@dimen/password_generation_dialog_padding"
-    android:paddingBottom="@dimen/password_generation_dialog_padding"
-    android:id="@+id/password_generation_dialog">
-
-    <org.chromium.ui.widget.TextViewWithLeading
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:id="@+id/generated_password"
-        android:textAppearance="@style/TextAppearance.TextLarge.Primary"
-        app:leading="20sp"
-        android:layout_marginBottom="24dp"/>
-
-    <org.chromium.ui.widget.TextViewWithLeading
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:id="@+id/generation_save_explanation"
-        android:textAppearance="@style/TextAppearance.TextMedium.Secondary"
-        app:leading="20sp"/>
-</org.chromium.chrome.browser.password_manager.PasswordGenerationDialogCustomView>
\ No newline at end of file
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 7e10249..2bfb8cb 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -83,9 +83,6 @@
     <dimen name="password_generation_horizontal_margin">10dp</dimen>
     <dimen name="password_generation_text_vertical_margin">12dp</dimen>
 
-    <!-- Password generation dialog dimensions -->
-    <dimen name="password_generation_dialog_padding">24dp</dimen>
-
     <!-- Password manager illustration dialogs -->
     <dimen name="password_manager_dialog_padding">8dp</dimen>
     <dimen name="password_manager_dialog_illustration_height">156dp</dimen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogBridge.java
deleted file mode 100644
index aab178ed..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogBridge.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2018 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.password_manager;
-
-import org.jni_zero.CalledByNative;
-import org.jni_zero.JniType;
-import org.jni_zero.NativeMethods;
-
-import org.chromium.ui.base.WindowAndroid;
-import org.chromium.ui.modaldialog.DialogDismissalCause;
-
-/** JNI call glue between native password generation and Java objects. */
-public class PasswordGenerationDialogBridge {
-    private long mNativePasswordGenerationDialogViewAndroid;
-    private final PasswordGenerationDialogCoordinator mPasswordGenerationDialog;
-    // TODO(ioanap): Get the generated password from the model once editing is in place.
-    private String mGeneratedPassword;
-
-    private PasswordGenerationDialogBridge(
-            WindowAndroid windowAndroid, long nativePasswordGenerationDialogViewAndroid) {
-        mNativePasswordGenerationDialogViewAndroid = nativePasswordGenerationDialogViewAndroid;
-        mPasswordGenerationDialog = new PasswordGenerationDialogCoordinator(windowAndroid);
-    }
-
-    @CalledByNative
-    public static PasswordGenerationDialogBridge create(
-            WindowAndroid windowAndroid, long nativeDialog) {
-        return new PasswordGenerationDialogBridge(windowAndroid, nativeDialog);
-    }
-
-    @CalledByNative
-    public void showDialog(
-            @JniType("std::u16string") String generatedPassword,
-            @JniType("std::u16string") String explanationString) {
-        mGeneratedPassword = generatedPassword;
-        mPasswordGenerationDialog.showDialog(
-                generatedPassword, explanationString, this::onPasswordAcceptedOrRejected);
-    }
-
-    @CalledByNative
-    private void destroy() {
-        mNativePasswordGenerationDialogViewAndroid = 0;
-        mPasswordGenerationDialog.dismissDialog(DialogDismissalCause.DISMISSED_BY_NATIVE);
-    }
-
-    private void onPasswordAcceptedOrRejected(boolean accepted) {
-        if (mNativePasswordGenerationDialogViewAndroid == 0) return;
-
-        if (accepted) {
-            PasswordGenerationDialogBridgeJni.get()
-                    .passwordAccepted(
-                            mNativePasswordGenerationDialogViewAndroid,
-                            PasswordGenerationDialogBridge.this,
-                            mGeneratedPassword);
-        } else {
-            PasswordGenerationDialogBridgeJni.get()
-                    .passwordRejected(
-                            mNativePasswordGenerationDialogViewAndroid,
-                            PasswordGenerationDialogBridge.this);
-        }
-        mPasswordGenerationDialog.dismissDialog(DialogDismissalCause.ACTION_ON_CONTENT);
-    }
-
-    @NativeMethods
-    interface Natives {
-        void passwordAccepted(
-                long nativePasswordGenerationDialogViewAndroid,
-                PasswordGenerationDialogBridge caller,
-                @JniType("std::u16string") String generatedPassword);
-
-        void passwordRejected(
-                long nativePasswordGenerationDialogViewAndroid,
-                PasswordGenerationDialogBridge caller);
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCoordinator.java
deleted file mode 100644
index 78e64cf..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCoordinator.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2018 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.password_manager;
-
-import android.app.Activity;
-import android.view.LayoutInflater;
-
-import androidx.annotation.NonNull;
-
-import org.chromium.base.Callback;
-import org.chromium.chrome.R;
-import org.chromium.ui.base.WindowAndroid;
-import org.chromium.ui.modaldialog.DialogDismissalCause;
-import org.chromium.ui.modaldialog.ModalDialogManager;
-import org.chromium.ui.modelutil.PropertyModel;
-
-/**
- * The coordinator for the password generation modal dialog. Manages the sub-component objects
- * and handles communication with the {@link ModalDialogManager}.
- */
-public class PasswordGenerationDialogCoordinator {
-    private final ModalDialogManager mModalDialogManager;
-    private final PasswordGenerationDialogModel mModel;
-    private final PasswordGenerationDialogCustomView mCustomView;
-
-    private PropertyModel mDialogModel;
-
-    public PasswordGenerationDialogCoordinator(@NonNull WindowAndroid windowAndroid) {
-        mModel = new PasswordGenerationDialogModel();
-        mModalDialogManager = windowAndroid.getModalDialogManager();
-
-        Activity activity = windowAndroid.getActivity().get();
-        assert activity != null;
-        mCustomView =
-                (PasswordGenerationDialogCustomView)
-                        LayoutInflater.from(activity)
-                                .inflate(R.layout.password_generation_dialog, null);
-    }
-
-    public void showDialog(
-            String generatedPassword,
-            String saveExplanationText,
-            Callback<Boolean> onPasswordAcceptedOrRejected) {
-        PasswordGenerationDialogMediator.initializeState(
-                mModel, generatedPassword, saveExplanationText);
-        PasswordGenerationDialogViewBinder.bind(mModel, mCustomView);
-
-        mDialogModel =
-                PasswordGenerationDialogMediator.createDialogModelBuilder(
-                                onPasswordAcceptedOrRejected, mCustomView)
-                        .build();
-        mModalDialogManager.showDialog(mDialogModel, ModalDialogManager.ModalDialogType.APP);
-    }
-
-    public void dismissDialog(@DialogDismissalCause int dismissalCause) {
-        mModalDialogManager.dismissDialog(mDialogModel, dismissalCause);
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCustomView.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCustomView.java
deleted file mode 100644
index 28b8fa5..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCustomView.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2018 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.password_manager;
-
-import android.content.Context;
-import android.text.InputType;
-import android.util.AttributeSet;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import androidx.annotation.Nullable;
-
-import org.chromium.chrome.R;
-
-/** The dialog content view for password generation dialog. */
-public class PasswordGenerationDialogCustomView extends LinearLayout {
-    // TODO(crbug.com/40572788): Make the generated password editable.
-    private TextView mGeneratedPasswordTextView;
-    private TextView mSaveExplantaionTextView;
-
-    /** Constructor for inflating from XML. */
-    public PasswordGenerationDialogCustomView(Context context, @Nullable AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-
-        mGeneratedPasswordTextView = findViewById(R.id.generated_password);
-        mSaveExplantaionTextView = findViewById(R.id.generation_save_explanation);
-    }
-
-    public void setGeneratedPassword(String generatedPassword) {
-        mGeneratedPasswordTextView.setText(generatedPassword);
-        mGeneratedPasswordTextView.setInputType(
-                InputType.TYPE_CLASS_TEXT
-                        | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
-                        | InputType.TYPE_TEXT_FLAG_MULTI_LINE);
-    }
-
-    public void setSaveExplanationText(String saveExplanationText) {
-        mSaveExplantaionTextView.setText(saveExplanationText);
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogMediator.java
deleted file mode 100644
index c648a915..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogMediator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2018 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.password_manager;
-
-import android.content.res.Resources;
-import android.view.View;
-
-import org.chromium.base.Callback;
-import org.chromium.chrome.R;
-import org.chromium.ui.modaldialog.ModalDialogProperties;
-import org.chromium.ui.modelutil.PropertyModel;
-
-/** Mediator class responsible for initializing the model state. */
-public class PasswordGenerationDialogMediator {
-    private static class DialogController implements ModalDialogProperties.Controller {
-        private final Callback<Boolean> mPasswordActionCallback;
-
-        public DialogController(Callback<Boolean> passwordActionCallback) {
-            mPasswordActionCallback = passwordActionCallback;
-        }
-
-        @Override
-        public void onClick(PropertyModel model, int buttonType) {
-            switch (buttonType) {
-                case ModalDialogProperties.ButtonType.POSITIVE:
-                    mPasswordActionCallback.onResult(true);
-                    break;
-                case ModalDialogProperties.ButtonType.NEGATIVE:
-                    mPasswordActionCallback.onResult(false);
-                    break;
-                default:
-                    assert false : "Unexpected button pressed in dialog: " + buttonType;
-            }
-        }
-
-        @Override
-        public void onDismiss(PropertyModel model, int dismissalCause) {
-            mPasswordActionCallback.onResult(false);
-        }
-    }
-
-    public static void initializeState(
-            PasswordGenerationDialogModel model, String password, String saveExplanationText) {
-        model.set(PasswordGenerationDialogModel.GENERATED_PASSWORD, password);
-        model.set(PasswordGenerationDialogModel.SAVE_EXPLANATION_TEXT, saveExplanationText);
-    }
-
-    static PropertyModel.Builder createDialogModelBuilder(
-            Callback<Boolean> onPasswordAcceptedOrRejected, View customView) {
-        Resources resources = customView.getResources();
-        PropertyModel.Builder builder =
-                new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
-                        .with(
-                                ModalDialogProperties.CONTROLLER,
-                                new DialogController(onPasswordAcceptedOrRejected))
-                        .with(ModalDialogProperties.CUSTOM_VIEW, customView)
-                        .with(
-                                ModalDialogProperties.POSITIVE_BUTTON_TEXT,
-                                resources,
-                                R.string.password_generation_dialog_use_password_button)
-                        .with(
-                                ModalDialogProperties.NEGATIVE_BUTTON_TEXT,
-                                resources,
-                                R.string.password_generation_dialog_cancel_button)
-                        .with(
-                                ModalDialogProperties.TITLE_ICON,
-                                customView.getContext(),
-                                new PasswordManagerResourceProviderImpl().getPasswordManagerIcon())
-                        .with(
-                                ModalDialogProperties.TITLE,
-                                resources,
-                                R.string.password_generation_dialog_title);
-        return builder;
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogModel.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogModel.java
deleted file mode 100644
index bd04d60..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogModel.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 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.password_manager;
-
-import org.chromium.ui.modelutil.PropertyModel;
-
-/** Data model for the password generation modal dialog. */
-class PasswordGenerationDialogModel extends PropertyModel {
-    /** The generated password to be displayed in the dialog. */
-    public static final WritableObjectPropertyKey<String> GENERATED_PASSWORD =
-            new WritableObjectPropertyKey<>();
-
-    /** Explanation text for how the generated password is saved. */
-    public static final WritableObjectPropertyKey<String> SAVE_EXPLANATION_TEXT =
-            new WritableObjectPropertyKey<>();
-
-    /** Default constructor */
-    public PasswordGenerationDialogModel() {
-        super(GENERATED_PASSWORD, SAVE_EXPLANATION_TEXT);
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogViewBinder.java
deleted file mode 100644
index aecf698..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogViewBinder.java
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018 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.password_manager;
-
-/** Class responsible for binding the model and the view. On bind, it lazily initializes the view
- * since all the needed data was made available at this point.
- */
-public class PasswordGenerationDialogViewBinder {
-    public static void bind(
-            PasswordGenerationDialogModel model, PasswordGenerationDialogCustomView viewHolder) {
-        viewHolder.setGeneratedPassword(
-                model.get(PasswordGenerationDialogModel.GENERATED_PASSWORD));
-        viewHolder.setSaveExplanationText(
-                model.get(PasswordGenerationDialogModel.SAVE_EXPLANATION_TEXT));
-    }
-}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java
deleted file mode 100644
index d8c926f..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2018 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.password_manager;
-
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.action.ViewActions.click;
-import static androidx.test.espresso.assertion.ViewAssertions.matches;
-import static androidx.test.espresso.matcher.ViewMatchers.withId;
-import static androidx.test.espresso.matcher.ViewMatchers.withText;
-
-import static org.mockito.Mockito.verify;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-import org.mockito.quality.Strictness;
-
-import org.chromium.base.Callback;
-import org.chromium.base.test.util.Batch;
-import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisabledTest;
-import org.chromium.chrome.browser.flags.ChromeSwitches;
-import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
-import org.chromium.chrome.test.R;
-import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
-import org.chromium.content_public.browser.test.util.TestThreadUtils;
-
-/** Test for the password manager dialog. */
-@RunWith(ChromeJUnit4ClassRunner.class)
-@Batch(Batch.PER_CLASS)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-public class PasswordGenerationDialogTest {
-    private PasswordGenerationDialogCoordinator mDialog;
-    private String mGeneratedPassword = "generatedpassword";
-    private String mExplanationString = "Explanation string.";
-
-    @Mock private Callback<Boolean> mOnPasswordAcceptedOrRejectedCallback;
-
-    @ClassRule
-    public static ChromeTabbedActivityTestRule sActivityTestRule =
-            new ChromeTabbedActivityTestRule();
-
-    @Rule
-    public BlankCTATabInitialStateRule mBlankCTATabInitialStateRule =
-            new BlankCTATabInitialStateRule(sActivityTestRule, false);
-
-    @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
-
-    @Before
-    public void setUp() throws InterruptedException {
-        mDialog =
-                TestThreadUtils.runOnUiThreadBlockingNoException(
-                        () -> {
-                            PasswordGenerationDialogCoordinator dialog =
-                                    new PasswordGenerationDialogCoordinator(
-                                            sActivityTestRule.getActivity().getWindowAndroid());
-                            dialog.showDialog(
-                                    mGeneratedPassword,
-                                    mExplanationString,
-                                    mOnPasswordAcceptedOrRejectedCallback);
-                            return dialog;
-                        });
-    }
-
-    @Test
-    @SmallTest
-    @DisabledTest(message = "https://crbug.com/1382439")
-    public void testDialogSubviewsData() {
-        onView(withId(R.id.generated_password)).check(matches(withText(mGeneratedPassword)));
-        onView(withId(R.id.generation_save_explanation))
-                .check(matches(withText(mExplanationString)));
-    }
-
-    @Test
-    @SmallTest
-    @DisabledTest(message = "https://crbug.com/1483526")
-    public void testAcceptedPasswordCallback() {
-        onView(withId(R.id.positive_button)).perform(click());
-        verify(mOnPasswordAcceptedOrRejectedCallback).onResult(true);
-    }
-
-    @Test
-    @SmallTest
-    @DisabledTest(message = "Disabled for flakiness, see https://crbug.com/1442595")
-    public void testRejectedPasswordCallback() {
-        onView(withId(R.id.negative_button)).perform(click());
-        verify(mOnPasswordAcceptedOrRejectedCallback).onResult(false);
-    }
-}
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index a4bba0d9..4aa767d 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -3799,34 +3799,34 @@
     Learn More
   </message>
   <message name="IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_ENABLED" desc="Message in the opt-in dialog for Android apps in case metrics are managed on the device and on.">
-    Send usage and diagnostic data. This device is currently automatically sending diagnostic, device, and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This <ph name="BEGIN_LINK1">&lt;a href="#" id="settings-link"&gt;</ph>setting<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph> is enforced by the owner. If your additional Web &#38; App Activity setting is turned on, this data may be saved to your Google account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Send usage and diagnostic data. This device is currently automatically sending diagnostic, device, and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This <ph name="BEGIN_LINK1">&lt;a href="#" id="settings-link"&gt;</ph>setting<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph> is enforced by the owner. If your additional Web &#38; App Activity setting is turned on, this data may be saved to your Google account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics" aria-label="</ph>Learn more about metrics<ph name="BEGIN_LINK2_END">"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_ENABLED_CHILD" desc="Message in the opt-in dialog for Android apps in case metrics are managed on the device and on, and a child account is in use.">
-    Send usage and diagnostic data. This device is currently automatically sending diagnostic, device, and app usage data to Google. This won't be used to identify your child and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This <ph name="BEGIN_LINK1">&lt;a href="#" id="settings-link"&gt;</ph>setting<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph> is enforced by the owner. If additional Web &#38; App Activity setting is turned on for your child, this data may be saved to their Google account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Send usage and diagnostic data. This device is currently automatically sending diagnostic, device, and app usage data to Google. This won't be used to identify your child and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This <ph name="BEGIN_LINK1">&lt;a href="#" id="settings-link"&gt;</ph>setting<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph> is enforced by the owner. If additional Web &#38; App Activity setting is turned on for your child, this data may be saved to their Google account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics" aria-label="</ph>Learn more about metrics<ph name="BEGIN_LINK2_END">"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_DISABLED" desc="Message in the opt-in dialog for Android apps in case metrics are managed on the device and off.">
-    Send usage and diagnostic data. Help improve your Android experience by automatically sending diagnostic, device, and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This <ph name="BEGIN_LINK1">&lt;a href="#" id="settings-link"&gt;</ph>setting<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph> is enforced by the owner. The owner may choose to send diagnostic and usage data for this device to Google. If your additional Web &#38; App Activity setting is turned on, this data may be saved to your Google account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Send usage and diagnostic data. Help improve your Android experience by automatically sending diagnostic, device, and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This <ph name="BEGIN_LINK1">&lt;a href="#" id="settings-link"&gt;</ph>setting<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph> is enforced by the owner. The owner may choose to send diagnostic and usage data for this device to Google. If your additional Web &#38; App Activity setting is turned on, this data may be saved to your Google account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics" aria-label="</ph>Learn more about metrics<ph name="BEGIN_LINK2_END">"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_DISABLED_CHILD" desc="Message in the opt-in dialog for Android apps in case metrics are managed on the device and off, and a child account is in use.">
-    Send usage and diagnostic data. Help improve your child's Android experience by automatically sending diagnostic, device, and app usage data to Google. This won't be used to identify your child and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This <ph name="BEGIN_LINK1">&lt;a href="#" id="settings-link"&gt;</ph>setting<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph> is enforced by the owner. The owner may choose to send diagnostic and usage data for this device to Google. If additional Web &#38; App Activity setting is turned on for your child, this data may be saved to their Google account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Send usage and diagnostic data. Help improve your child's Android experience by automatically sending diagnostic, device, and app usage data to Google. This won't be used to identify your child and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This <ph name="BEGIN_LINK1">&lt;a href="#" id="settings-link"&gt;</ph>setting<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph> is enforced by the owner. The owner may choose to send diagnostic and usage data for this device to Google. If additional Web &#38; App Activity setting is turned on for your child, this data may be saved to their Google account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics" aria-label="</ph>Learn more about metrics<ph name="BEGIN_LINK2_END">"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_DIALOG_METRICS_ENABLED" desc="Message in the opt-in dialog for Android apps in case metrics are already enabled on the device. User has no way to deactivate them using opt-in dialog.">
-    Send usage and diagnostic data. This device is currently automatically sending diagnostic, device, and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If your additional Web &#38; App Activity setting is turned on, this data may be saved to your Google Account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Send usage and diagnostic data. This device is currently automatically sending diagnostic, device, and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If your additional Web &#38; App Activity setting is turned on, this data may be saved to your Google Account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics" aria-label="</ph>Learn more about metrics<ph name="BEGIN_LINK2_END">"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_DIALOG_METRICS_ENABLED_CHILD" desc="Message in the opt-in dialog for Android apps in case metrics are already enabled on the device, and a child account is in use. User has no way to deactivate them using opt-in dialog.">
-    Send usage and diagnostic data. This device is currently automatically sending diagnostic, device, and app usage data to Google. This won't be used to idenfity your child and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If additional Web &#38; App Activity setting is turned on for your child, this data may be saved to their Google Account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Send usage and diagnostic data. This device is currently automatically sending diagnostic, device, and app usage data to Google. This won't be used to idenfity your child and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If additional Web &#38; App Activity setting is turned on for your child, this data may be saved to their Google Account. <ph name="BEGIN_LINK2">&lt;a href="#" id="learn-more-link-metrics" aria-label="</ph>Learn more about metrics<ph name="BEGIN_LINK2_END">"&gt;</ph>Learn More<ph name="END_LINK2">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_DIALOG_METRICS_DISABLED" desc="Message in the opt-in dialog for Android apps in case metrics are disabled on the device. User has an option to active them using opt-in dialog">
-    Send usage and diagnostic data. Help improve your Android experience by automatically sending diagnostic, device, and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If your additional Web &#38; App Activity setting is turned on, this data may be saved to your Google account. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-metrics"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Send usage and diagnostic data. Help improve your Android experience by automatically sending diagnostic, device, and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If your additional Web &#38; App Activity setting is turned on, this data may be saved to your Google account. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-metrics" aria-label="</ph>Learn more about metrics<ph name="BEGIN_LINK1_END">"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_DIALOG_METRICS_DISABLED_CHILD" desc="Message in the opt-in dialog for Android apps in case metrics are disabled on the device, and a child account is in use. User has an option to active them using opt-in dialog">
-    Send usage and diagnostic data. Help improve your child's Android experience by automatically sending diagnostic, device, and app usage data to Google. This won't be used to identify your child and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If additional Web &#38; App Activity is turned on for you child, this data may be saved to their Google account. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-metrics"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Send usage and diagnostic data. Help improve your child's Android experience by automatically sending diagnostic, device, and app usage data to Google. This won't be used to identify your child and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If additional Web &#38; App Activity is turned on for you child, this data may be saved to their Google account. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-metrics" aria-label="</ph>Learn more about metrics<ph name="BEGIN_LINK1_END">"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE" desc="Message in the opt-in dialog for users to enable Backup and Restore for Android apps.">
-    Back up to Google Drive. Easily restore your data or switch device at any time. Your backup includes app data. Your backups are uploaded to Google and encrypted using your Google Account password. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-backup-restore"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Back up to Google Drive. Easily restore your data or switch device at any time. Your backup includes app data. Your backups are uploaded to Google and encrypted using your Google Account password. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-backup-restore" aria-label="</ph>Learn more about backup<ph name="BEGIN_LINK1_END">"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE_CHILD" desc="Message in the opt-in dialog for users to enable Backup and Restore for Android apps, and a child account is in use.">
-    Back up to Google Drive. Easily restore data or switch device at any time. This backup includes app data. Backups are uploaded to Google and encrypted using your child's Google Account password. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-backup-restore"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Back up to Google Drive. Easily restore data or switch device at any time. This backup includes app data. Backups are uploaded to Google and encrypted using your child's Google Account password. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-backup-restore" aria-label="</ph>Learn more about backup<ph name="BEGIN_LINK1_END">"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE_LABEL" desc="This string is spoken when ChromeVox focuses the checkbox to enable Backup and Restore for Android apps in the opt-in dialog." is_accessibility_with_no_ui="true">
     Back up to Google Drive. Easily restore your data or switch device at any time. Your backup includes app data. Your backups are uploaded to Google and encrypted using your Google Account password.
@@ -3868,19 +3868,19 @@
     Note that Android, Play, and associated apps are governed by their own data collection and use policies.
   </message>
   <message name="IDS_ARC_OPT_IN_LOCATION_SETTING" desc="Message in the opt-in dialog for Android apps for the user to turn on Google location services.">
-    Use location. Allow apps and services with location permission to use your device’s location. Google may collect location data periodically and use this data in an anonymous way to improve location accuracy and location-based services. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-location-service"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Use location. Allow apps and services with location permission to use your device’s location. Google may collect location data periodically and use this data in an anonymous way to improve location accuracy and location-based services. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-location-service" aria-label="</ph>Learn more about location<ph name="BEGIN_LINK1_END">"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_LOCATION_SETTING_CHILD" desc="Message in the opt-in dialog for Android apps for the user to turn on Google location services, and a child account is in use.">
-    Use location. Allow apps and services with location permission to use this device’s location. Google may collect location data periodically and use this data in an anonymous way to improve location accuracy and location-based services. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-location-service"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Use location. Allow apps and services with location permission to use this device’s location. Google may collect location data periodically and use this data in an anonymous way to improve location accuracy and location-based services. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-location-service" aria-label="</ph>Learn more about location<ph name="BEGIN_LINK1_END">"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_CROS_OPT_IN_LOCATION_SETTING" desc="Message in the opt-in dialog for Android apps for the user to turn on Google location services.">
-    Use location. Allow ChromeOS and Android apps, websites, and services with location permission to use your device's location. Google may collect location data periodically and use this data in an anonymous way to improve location accuracy and location-based services. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-location-service"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Use location. Allow ChromeOS and Android apps, websites, and services with location permission to use your device's location. Google may collect location data periodically and use this data in an anonymous way to improve location accuracy and location-based services. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-location-service" aria-label="</ph>Learn more about location<ph name="BEGIN_LINK1_END">"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_CROS_OPT_IN_LOCATION_SETTING_CHILD" desc="Message in the opt-in dialog for Android apps for the user to turn on Google location services, and a child account is in use.">
-    Use location. Allow ChromeOS and Android apps, websites, and services with location permission to use this device's location. Google may collect location data periodically and use this data in an anonymous way to improve location accuracy and location-based services. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-location-service"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Use location. Allow ChromeOS and Android apps, websites, and services with location permission to use this device's location. Google may collect location data periodically and use this data in an anonymous way to improve location accuracy and location-based services. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-location-service" aria-label="</ph>Learn more about location<ph name="BEGIN_LINK1_END">"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OPT_IN_PAI" desc="Message in the opt-in dialog for Play auto install.">
-    Install updates &#38; apps. By continuing, you agree that this device may also automatically download and install updates and apps from Google, your carrier, and your device's manufacturer, possibly using cellular data. Some of these apps may offer in-app purchases. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-pai"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Install updates &#38; apps. By continuing, you agree that this device may also automatically download and install updates and apps from Google, your carrier, and your device's manufacturer, possibly using cellular data. Some of these apps may offer in-app purchases. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-pai" aria-label="</ph>Learn more about play auto install<ph name="BEGIN_LINK1_END">"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
   <message name="IDS_ARC_OOBE_PAI" desc="Message in the opt-in dialog for Play auto install.">
     Install updates &#38; apps. By continuing, you agree that this device may also automatically download and install updates and apps from Google, your carrier, and your device's manufacturer, possibly using cellular data. Some of these apps may offer in-app purchases.
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE.png.sha1
new file mode 100644
index 0000000..2b39937
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE.png.sha1
@@ -0,0 +1 @@
+f1e6d923b75fd03dc0828d519f267cdf6ccdf925
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE_CHILD.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE_CHILD.png.sha1
new file mode 100644
index 0000000..2b39937
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE_CHILD.png.sha1
@@ -0,0 +1 @@
+f1e6d923b75fd03dc0828d519f267cdf6ccdf925
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_DISABLED.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_DISABLED.png.sha1
new file mode 100644
index 0000000..2b39937
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_DISABLED.png.sha1
@@ -0,0 +1 @@
+f1e6d923b75fd03dc0828d519f267cdf6ccdf925
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_DISABLED_CHILD.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_DISABLED_CHILD.png.sha1
new file mode 100644
index 0000000..2b39937
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_DISABLED_CHILD.png.sha1
@@ -0,0 +1 @@
+f1e6d923b75fd03dc0828d519f267cdf6ccdf925
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_ENABLED.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_ENABLED.png.sha1
new file mode 100644
index 0000000..2b39937
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_ENABLED.png.sha1
@@ -0,0 +1 @@
+f1e6d923b75fd03dc0828d519f267cdf6ccdf925
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_ENABLED_CHILD.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_ENABLED_CHILD.png.sha1
new file mode 100644
index 0000000..2b39937
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_ENABLED_CHILD.png.sha1
@@ -0,0 +1 @@
+f1e6d923b75fd03dc0828d519f267cdf6ccdf925
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_DISABLED.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_DISABLED.png.sha1
new file mode 100644
index 0000000..2b39937
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_DISABLED.png.sha1
@@ -0,0 +1 @@
+f1e6d923b75fd03dc0828d519f267cdf6ccdf925
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_DISABLED_CHILD.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_DISABLED_CHILD.png.sha1
new file mode 100644
index 0000000..2b39937
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_DISABLED_CHILD.png.sha1
@@ -0,0 +1 @@
+f1e6d923b75fd03dc0828d519f267cdf6ccdf925
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_ENABLED.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_ENABLED.png.sha1
new file mode 100644
index 0000000..2b39937
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_ENABLED.png.sha1
@@ -0,0 +1 @@
+f1e6d923b75fd03dc0828d519f267cdf6ccdf925
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_ENABLED_CHILD.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_ENABLED_CHILD.png.sha1
new file mode 100644
index 0000000..2b39937
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_DIALOG_METRICS_MANAGED_ENABLED_CHILD.png.sha1
@@ -0,0 +1 @@
+f1e6d923b75fd03dc0828d519f267cdf6ccdf925
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_LOCATION_SETTING.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_LOCATION_SETTING.png.sha1
new file mode 100644
index 0000000..028f2b3d
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_LOCATION_SETTING.png.sha1
@@ -0,0 +1 @@
+3bb88f41be83539f2c15fd287f8f445c2cbe3959
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_LOCATION_SETTING_CHILD.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_LOCATION_SETTING_CHILD.png.sha1
new file mode 100644
index 0000000..028f2b3d
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_LOCATION_SETTING_CHILD.png.sha1
@@ -0,0 +1 @@
+3bb88f41be83539f2c15fd287f8f445c2cbe3959
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_PAI.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_PAI.png.sha1
new file mode 100644
index 0000000..028f2b3d
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OPT_IN_PAI.png.sha1
@@ -0,0 +1 @@
+3bb88f41be83539f2c15fd287f8f445c2cbe3959
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_CROS_OPT_IN_LOCATION_SETTING.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_CROS_OPT_IN_LOCATION_SETTING.png.sha1
index 043391d..028f2b3d 100644
--- a/chrome/app/chromeos_strings_grdp/IDS_CROS_OPT_IN_LOCATION_SETTING.png.sha1
+++ b/chrome/app/chromeos_strings_grdp/IDS_CROS_OPT_IN_LOCATION_SETTING.png.sha1
@@ -1 +1 @@
-5199a95ae85136b77f77d37f981f3d6bf128cb95
\ No newline at end of file
+3bb88f41be83539f2c15fd287f8f445c2cbe3959
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_CROS_OPT_IN_LOCATION_SETTING_CHILD.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_CROS_OPT_IN_LOCATION_SETTING_CHILD.png.sha1
index ac05b218..028f2b3d 100644
--- a/chrome/app/chromeos_strings_grdp/IDS_CROS_OPT_IN_LOCATION_SETTING_CHILD.png.sha1
+++ b/chrome/app/chromeos_strings_grdp/IDS_CROS_OPT_IN_LOCATION_SETTING_CHILD.png.sha1
@@ -1 +1 @@
-ce7bd65b152b282b7f3a9e83c8df6568318ed5d1
\ No newline at end of file
+3bb88f41be83539f2c15fd287f8f445c2cbe3959
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 65e1a00..2ae61d87 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -3387,7 +3387,6 @@
       "password_manager/android/password_generation_controller.h",
       "password_manager/android/password_generation_controller_impl.cc",
       "password_manager/android/password_generation_controller_impl.h",
-      "password_manager/android/password_generation_dialog_view_interface.h",
       "password_manager/android/password_infobar_utils.cc",
       "password_manager/android/password_infobar_utils.h",
       "password_manager/android/password_manager_error_message_delegate.cc",
@@ -5388,6 +5387,7 @@
       "//chrome/browser/ash",
       "//chrome/browser/ash/borealis:borealis_installer_types_mojom",
       "//chrome/browser/ash/crosapi",
+      "//chrome/browser/ash/cryptauth",
       "//chrome/browser/ash/mojo_service_manager:mojo_service_manager",
       "//chrome/browser/ash/power/ml/smart_dim",
       "//chrome/browser/ash/smart_reader",
@@ -5555,6 +5555,7 @@
     allow_circular_includes_from += [
       "//chrome/browser/ash",
       "//chrome/browser/ash/crosapi",
+      "//chrome/browser/ash/cryptauth",
       "//chrome/browser/ash/system_web_apps",
     ]
 
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index bb4fc5b..d8e36aa 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -10084,14 +10084,6 @@
      SINGLE_VALUE_TYPE(ash::switches::kEolResetDismissedPrefs)},
 #endif
 
-#if BUILDFLAG(IS_ANDROID)
-    {"password-generation-bottom-sheet",
-     flag_descriptions::kPasswordGenerationBottomSheetName,
-     flag_descriptions::kPasswordGenerationBottomSheetDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(
-         password_manager::features::kPasswordGenerationBottomSheet)},
-#endif  // BUILDFLAG(IS_ANDROID)
-
     {"enable-preferences-account-storage",
      flag_descriptions::kEnablePreferencesAccountStorageName,
      flag_descriptions::kEnablePreferencesAccountStorageDescription, kOsAll,
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn
index bb9dd361..9b14b71 100644
--- a/chrome/browser/ash/BUILD.gn
+++ b/chrome/browser/ash/BUILD.gn
@@ -979,14 +979,6 @@
     "crostini/throttle/crostini_active_window_throttle_observer.h",
     "crostini/throttle/crostini_throttle.cc",
     "crostini/throttle/crostini_throttle.h",
-    "cryptauth/client_app_metadata_provider_service.cc",
-    "cryptauth/client_app_metadata_provider_service.h",
-    "cryptauth/client_app_metadata_provider_service_factory.cc",
-    "cryptauth/client_app_metadata_provider_service_factory.h",
-    "cryptauth/cryptauth_device_id_provider_impl.cc",
-    "cryptauth/cryptauth_device_id_provider_impl.h",
-    "cryptauth/gcm_device_info_provider_impl.cc",
-    "cryptauth/gcm_device_info_provider_impl.h",
     "customization/customization_document.cc",
     "customization/customization_document.h",
     "customization/customization_wallpaper_downloader.cc",
@@ -3714,6 +3706,7 @@
   allow_circular_includes_from = [
     "//chrome/browser/apps/platform_apps/api",
     "//chrome/browser/ash/crosapi",
+    "//chrome/browser/ash/cryptauth",
     "//chrome/browser/ash/system_web_apps",
     "//chrome/browser/chromeos",
     "//chrome/browser/extensions",
@@ -4218,6 +4211,7 @@
     "//chrome/browser/apps/platform_apps",
     "//chrome/browser/apps/platform_apps/api",
     "//chrome/browser/ash/authpolicy",
+    "//chrome/browser/ash/cryptauth",
     "//chrome/browser/ash/mojo_service_manager",
     "//chrome/browser/ash/nearby:bluetooth_adapter_manager",
     "//chrome/browser/ash/nearby/presence/credential_storage/metrics",
@@ -5648,7 +5642,6 @@
     "crostini/termina_installer_unittest.cc",
     "crostini/throttle/crostini_active_window_throttle_observer_unittest.cc",
     "crostini/throttle/crostini_throttle_unittest.cc",
-    "cryptauth/client_app_metadata_provider_service_unittest.cc",
     "customization/customization_document_unittest.cc",
     "dbus/chrome_features_service_provider_unittest.cc",
     "dbus/dlp_files_policy_service_provider_unittest.cc",
@@ -6413,6 +6406,7 @@
     "//chrome/browser/ash/crosapi:browser_util",
     "//chrome/browser/ash/crosapi:test_support",
     "//chrome/browser/ash/crostini:crostini_installer_types_mojom",
+    "//chrome/browser/ash/cryptauth:unit_tests",
     "//chrome/browser/ash/guest_os:guest_os_diagnostics_mojom",
     "//chrome/browser/ash/mall:unit_tests",
     "//chrome/browser/ash/nearby:bluetooth_adapter_manager",
diff --git a/chrome/browser/ash/cryptauth/BUILD.gn b/chrome/browser/ash/cryptauth/BUILD.gn
new file mode 100644
index 0000000..b4253e67a1
--- /dev/null
+++ b/chrome/browser/ash/cryptauth/BUILD.gn
@@ -0,0 +1,47 @@
+# 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.
+
+import("//build/config/chromeos/ui_mode.gni")
+
+assert(is_chromeos_ash)
+
+source_set("cryptauth") {
+  sources = [
+    "client_app_metadata_provider_service.cc",
+    "client_app_metadata_provider_service.h",
+    "client_app_metadata_provider_service_factory.cc",
+    "client_app_metadata_provider_service_factory.h",
+    "cryptauth_device_id_provider_impl.cc",
+    "cryptauth_device_id_provider_impl.h",
+    "gcm_device_info_provider_impl.cc",
+    "gcm_device_info_provider_impl.h",
+  ]
+  deps = [
+    "//ash/constants",
+    "//base",
+    "//chrome/browser:browser_process",
+    "//chrome/browser/profiles",
+    "//chrome/common:constants",
+    "//chromeos/ash/components/multidevice/logging",
+    "//chromeos/ash/components/network",
+    "//chromeos/ash/services/device_sync/proto",
+    "//chromeos/ash/services/device_sync/public/cpp",
+    "//components/gcm_driver/instance_id",
+    "//components/leveldb_proto",
+    "//components/prefs",
+    "//components/version_info",
+    "//device/bluetooth",
+    "//skia",
+  ]
+}
+
+source_set("unit_tests") {
+  testonly = true
+  sources = [ "client_app_metadata_provider_service_unittest.cc" ]
+  deps = [
+    ":cryptauth",
+    "//base",
+    "//testing/gtest",
+  ]
+}
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
index 53763e01..d68b26f 100644
--- a/chrome/browser/ash/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
@@ -391,6 +391,9 @@
             .EnableSkyVault(),
         TestCase("fileDisplayLocalFilesDisableInMyFiles")
             .DontMountVolumes()
+            .EnableSkyVault(),
+        TestCase("fileDisplayOneDrivePlaceholder")
+            .DontMountVolumes()
             .EnableSkyVault()));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
index c8222ba4..c7b601a 100644
--- a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
+++ b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
@@ -2498,8 +2498,10 @@
 
   if (options.enable_skyvault) {
     enabled_features.push_back(features::kSkyVault);
+    enabled_features.push_back(features::kSkyVaultV2);
   } else {
     disabled_features.push_back(features::kSkyVault);
+    disabled_features.push_back(features::kSkyVaultV2);
   }
 
   // This is destroyed in |TearDown()|. We cannot initialize this in the
@@ -3490,8 +3492,14 @@
   }
 
   if (name == "setupSkyVault") {
+    // Set the download / default Files App directory.
+    const std::string* defaultLocation = value.FindString("defaultLocation");
+    ASSERT_TRUE(defaultLocation &&
+                (*defaultLocation == download_dir_util::kLocationGoogleDrive ||
+                 *defaultLocation == download_dir_util::kLocationOneDrive));
     profile()->GetPrefs()->SetString(prefs::kFilesAppDefaultLocation,
-                                     download_dir_util::kLocationGoogleDrive);
+                                     *defaultLocation);
+    // Disable local files.
     g_browser_process->local_state()->SetBoolean(prefs::kLocalUserFilesAllowed,
                                                  false);
     return;
diff --git a/chrome/browser/ash/file_manager/file_manager_string_util.cc b/chrome/browser/ash/file_manager/file_manager_string_util.cc
index 5b0f340..a5e41e8a 100644
--- a/chrome/browser/ash/file_manager/file_manager_string_util.cc
+++ b/chrome/browser/ash/file_manager/file_manager_string_util.cc
@@ -381,8 +381,6 @@
   SET_STRING("ALL_FILES_FILTER", IDS_FILE_BROWSER_ALL_FILES_FILTER);
   SET_STRING("ARCHIVE_MOUNT_FAILED", IDS_FILE_BROWSER_ARCHIVE_MOUNT_FAILED);
   SET_STRING("ARCHIVE_MOUNT_MESSAGE", IDS_FILE_BROWSER_ARCHIVE_MOUNT_MESSAGE);
-  SET_STRING("ARCHIVE_MOUNT_INVALID_PATH",
-             IDS_FILE_BROWSER_ARCHIVE_MOUNT_INVALID_PATH);
   SET_STRING("BULK_PINNING_BATTERY_SAVER",
              IDS_FILE_BROWSER_BULK_PINNING_BATTERY_SAVER);
   SET_STRING("BULK_PINNING_ERROR", IDS_FILE_BROWSER_BULK_PINNING_ERROR);
diff --git a/chrome/browser/ash/file_system_provider/cloud_file_system.cc b/chrome/browser/ash/file_system_provider/cloud_file_system.cc
index 24a597df..7a96817 100644
--- a/chrome/browser/ash/file_system_provider/cloud_file_system.cc
+++ b/chrome/browser/ash/file_system_provider/cloud_file_system.cc
@@ -574,7 +574,7 @@
                               OpenedCloudFile(file_path, mode, file_handle,
                                               GetVersionTag(metadata.get()),
                                               GetCloudSize(metadata.get())));
-  } else if (result == base::File::FILE_ERROR_NOT_FOUND) {
+  } else if (content_cache_ && result == base::File::FILE_ERROR_NOT_FOUND) {
     // The file doesn't exist on the FSP, evict it from the cache.
     content_cache_->Evict(file_path);
   }
diff --git a/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.cc b/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.cc
index 11a7c20..e7251df 100644
--- a/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.cc
+++ b/chrome/browser/ash/file_system_provider/content_cache/content_cache_impl.cc
@@ -316,7 +316,7 @@
 
   if (offset == ctx.bytes_on_disk() && offset == file.bytes_in_cloud) {
     VLOG(1) << "Ignored request: offset is at EOF";
-    callback.Run(0, false, base::File::FILE_OK);
+    callback.Run(/*bytes_read=*/0, /*has_more=*/false, base::File::FILE_OK);
     return;
   }
 
diff --git a/chrome/browser/ash/fileapi/fallback_copy_in_foreign_file_unittest.cc b/chrome/browser/ash/fileapi/fallback_copy_in_foreign_file_unittest.cc
index 4cd0493..444db526 100644
--- a/chrome/browser/ash/fileapi/fallback_copy_in_foreign_file_unittest.cc
+++ b/chrome/browser/ash/fileapi/fallback_copy_in_foreign_file_unittest.cc
@@ -17,6 +17,7 @@
 #include "storage/browser/test/mock_special_storage_policy.h"
 #include "storage/browser/test/test_file_system_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 
 namespace ash {
 
@@ -98,11 +99,11 @@
       storage::ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
           mount_name, storage::kFileSystemTypeLocal,
           storage::FileSystemMountOption(), dest_temp_dir.GetPath()));
-  base::ScopedClosureRunner mount_points_unregisterer(base::BindOnce([]() {
+  absl::Cleanup mount_points_unregisterer = [] {
     EXPECT_TRUE(
         storage::ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(
             mount_name));
-  }));
+  };
 
   // Call FallbackCopyInForeignFile.
   {
diff --git a/chrome/browser/ash/login/screens/personalized_recommend_apps_screen.cc b/chrome/browser/ash/login/screens/personalized_recommend_apps_screen.cc
index d682cc8..8dc8dd2 100644
--- a/chrome/browser/ash/login/screens/personalized_recommend_apps_screen.cc
+++ b/chrome/browser/ash/login/screens/personalized_recommend_apps_screen.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ash/login/screens/personalized_recommend_apps_screen.h"
 
+#include "ash/constants/ash_switches.h"
 #include "chrome/browser/ash/arc/arc_util.h"
 #include "chrome/browser/ash/login/login_pref_names.h"
 #include "chrome/browser/ash/login/wizard_controller.h"
@@ -68,9 +69,16 @@
     return true;
   }
 
-  // Only show screen for new ChromeOS user.
+  // This screen is currently shown only to the new-to-ChromeOS users. To
+  // understand which user is actually a new one we use a synced preference
+  // `kOobeMarketingOptInScreenFinished` which is set only once for each user
+  // in the end of the OOBE flow.
+  // This logic might be replaced in the future by checking a list of potential
+  // synced apps for the user, but at this moment this preference check is
+  // sufficient for our needs.
   PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs();
-  if (prefs->GetBoolean(prefs::kOobeMarketingOptInScreenFinished)) {
+  if (prefs->GetBoolean(prefs::kOobeMarketingOptInScreenFinished) &&
+      !ash::switches::ShouldSkipNewUserCheckForTesting()) {
     return true;
   }
 
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index dd5927e..8e02930 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1593,6 +1593,9 @@
       true);
 
   registry->RegisterBooleanPref(
+      policy::policy_prefs::kKeyboardFocusableScrollersEnabled, true);
+
+  registry->RegisterBooleanPref(
       policy::policy_prefs::
           kAllowBackForwardCacheForCacheControlNoStorePageEnabled,
       true);
@@ -2644,6 +2647,12 @@
         command_line->AppendSwitch(blink::switches::kMutationEventsEnabled);
       }
 
+      if (!prefs->GetBoolean(
+              policy::policy_prefs::kKeyboardFocusableScrollersEnabled)) {
+        command_line->AppendSwitch(
+            blink::switches::kKeyboardFocusableScrollersOptOut);
+      }
+
       if (prefs->GetBoolean(policy::policy_prefs::
                                 kForcePermissionPolicyUnloadDefaultEnabled)) {
         command_line->AppendSwitch(
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
index 132a68f..3f4e489 100644
--- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
+++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
@@ -7936,8 +7936,7 @@
 // Test that modifyHeaders rules matched in both onBeforeRequest and
 // onHeadersReceived phases will perform the correct action(s) on the request.
 IN_PROC_BROWSER_TEST_P(DNRMatchResponseHeadersBrowserTest,
-                       // TODO(crbug.com/340136384): Re-enable this test
-                       DISABLED_ModifyHeaders_SingleExtension) {
+                       ModifyHeaders_SingleExtension) {
   std::vector<TestHeaderCondition> blank_header_condition =
       std::vector<TestHeaderCondition>(
           {TestHeaderCondition("nonsense-header", {}, {})});
diff --git a/chrome/browser/facilitated_payments/ui/chrome_facilitated_payments_client.h b/chrome/browser/facilitated_payments/ui/chrome_facilitated_payments_client.h
index aab54c1..183580a 100644
--- a/chrome/browser/facilitated_payments/ui/chrome_facilitated_payments_client.h
+++ b/chrome/browser/facilitated_payments/ui/chrome_facilitated_payments_client.h
@@ -43,6 +43,8 @@
   friend class content::WebContentsUserData<ChromeFacilitatedPaymentsClient>;
 
   FRIEND_TEST_ALL_PREFIXES(ChromeFacilitatedPaymentsClientTest,
+                           GetPersonalDataManager);
+  FRIEND_TEST_ALL_PREFIXES(ChromeFacilitatedPaymentsClientTest,
                            GetFacilitatedPaymentsNetworkInterface);
 
   // FacilitatedPaymentsClient:
diff --git a/chrome/browser/facilitated_payments/ui/chrome_facilitated_payments_client_unittest.cc b/chrome/browser/facilitated_payments/ui/chrome_facilitated_payments_client_unittest.cc
index ca8fd1b..88f9e70 100644
--- a/chrome/browser/facilitated_payments/ui/chrome_facilitated_payments_client_unittest.cc
+++ b/chrome/browser/facilitated_payments/ui/chrome_facilitated_payments_client_unittest.cc
@@ -43,6 +43,14 @@
 
 using ChromeFacilitatedPaymentsClientTest = ChromeRenderViewHostTestHarness;
 
+TEST_F(ChromeFacilitatedPaymentsClientTest, GetPersonalDataManager) {
+  MockOptimizationGuideDecider optimization_guide_decider;
+  auto client = std::make_unique<ChromeFacilitatedPaymentsClient>(
+      web_contents(), &optimization_guide_decider);
+
+  EXPECT_NE(nullptr, client->GetPersonalDataManager());
+}
+
 TEST_F(ChromeFacilitatedPaymentsClientTest,
        GetFacilitatedPaymentsNetworkInterface) {
   MockOptimizationGuideDecider optimization_guide_decider;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index dceae0b7..fab7e677 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -310,7 +310,7 @@
   {
     "name": "arc-ignore-hover-event-anr",
     "owners": [ "lingyufeng@chromium.org", "arc-user-focus@google.com" ],
-    "expiry_milestone": 125
+    "expiry_milestone": 130
   },
   { "name": "arc-instant-response-window-open",
     "owners": [ "sstan@chromium.org", "mduggan@chromium.org" ],
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 6a00fbd..9816dbb 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -4322,11 +4322,6 @@
     "Enables storing successful query/match in the omnibox shortcut database "
     "on Android";
 
-const char kPasswordGenerationBottomSheetName[] =
-    "Password generation bottom sheet";
-const char kPasswordGenerationBottomSheetDescription[] =
-    "Enabled showing the password generation bottom sheet.";
-
 const char kQueryTilesName[] = "Show query tiles";
 const char kQueryTilesDescription[] = "Shows query tiles in Chrome";
 const char kQueryTilesNTPName[] = "Show query tiles in NTP";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 149c4b2..b9bfd1d 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2558,9 +2558,6 @@
 extern const char kOmniboxShortcutsAndroidName[];
 extern const char kOmniboxShortcutsAndroidDescription[];
 
-extern const char kPasswordGenerationBottomSheetName[];
-extern const char kPasswordGenerationBottomSheetDescription[];
-
 extern const char kPasswordSuggestionBottomSheetV2Name[];
 extern const char kPasswordSuggestionBottomSheetV2Description[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index d20192d4..a88bca8 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -309,7 +309,6 @@
     &optimization_guide::features::kPushNotifications,
     &page_info::kPageInfoAboutThisSiteMoreLangs,
     &password_manager::features::kBiometricTouchToFill,
-    &password_manager::features::kPasswordGenerationBottomSheet,
     &password_manager::features::kSharedPasswordNotificationUI,
     &password_manager::features::
         kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 41ed23c..0ac4f4e 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -363,7 +363,6 @@
             "PageInfoAboutThisSiteMoreLangs";
     public static final String PAINT_PREVIEW_DEMO = "PaintPreviewDemo";
     public static final String PARTNER_CUSTOMIZATIONS_UMA = "PartnerCustomizationsUma";
-    public static final String PASSWORD_GENERATION_BOTTOM_SHEET = "PasswordGenerationBottomSheet";
     public static final String PERMISSION_DEDICATED_CPSS_SETTING_ANDROID =
             "PermissionDedicatedCpssSettingAndroid";
     public static final String PLUS_ADDRESSES_ENABLED = "PlusAddressesEnabled";
diff --git a/chrome/browser/password_manager/android/add_username_dialog/add_username_dialog_bridge.cc b/chrome/browser/password_manager/android/add_username_dialog/add_username_dialog_bridge.cc
index a3c3bd22..c11202fe 100644
--- a/chrome/browser/password_manager/android/add_username_dialog/add_username_dialog_bridge.cc
+++ b/chrome/browser/password_manager/android/add_username_dialog/add_username_dialog_bridge.cc
@@ -66,7 +66,7 @@
 }
 
 AddUsernameDialogBridge::AddUsernameDialogBridge(
-    base::PassKey<class GeneratedPasswordSavedMessageDelegateTestBase>,
+    base::PassKey<class GeneratedPasswordSavedMessageDelegateTest>,
     std::unique_ptr<JniDelegate> jni_delegate)
     : jni_delegate_(std::move(jni_delegate)) {}
 
diff --git a/chrome/browser/password_manager/android/add_username_dialog/add_username_dialog_bridge.h b/chrome/browser/password_manager/android/add_username_dialog/add_username_dialog_bridge.h
index 50e1289..7cc3f3c 100644
--- a/chrome/browser/password_manager/android/add_username_dialog/add_username_dialog_bridge.h
+++ b/chrome/browser/password_manager/android/add_username_dialog/add_username_dialog_bridge.h
@@ -35,7 +35,7 @@
 
   AddUsernameDialogBridge();
   AddUsernameDialogBridge(
-      base::PassKey<class GeneratedPasswordSavedMessageDelegateTestBase>,
+      base::PassKey<class GeneratedPasswordSavedMessageDelegateTest>,
       std::unique_ptr<JniDelegate> jni_delegate);
   ~AddUsernameDialogBridge();
   // Disallow copy and assign.
diff --git a/chrome/browser/password_manager/android/generated_password_saved_message_delegate.cc b/chrome/browser/password_manager/android/generated_password_saved_message_delegate.cc
index bf325bc..6e43f44f 100644
--- a/chrome/browser/password_manager/android/generated_password_saved_message_delegate.cc
+++ b/chrome/browser/password_manager/android/generated_password_saved_message_delegate.cc
@@ -22,7 +22,7 @@
           []() { return std::make_unique<AddUsernameDialogBridge>(); })) {}
 
 GeneratedPasswordSavedMessageDelegate::GeneratedPasswordSavedMessageDelegate(
-    base::PassKey<class GeneratedPasswordSavedMessageDelegateTestBase>,
+    base::PassKey<class GeneratedPasswordSavedMessageDelegateTest>,
     CreateAddUsernameDialogBridge add_username_dialog_factory)
     : add_username_dialog_factory_(std::move(add_username_dialog_factory)) {}
 
@@ -57,9 +57,7 @@
   saved_form_ = std::move(saved_form);
   const std::u16string& username =
       saved_form_->GetPendingCredentials().username_value;
-  if (base::FeatureList::IsEnabled(
-          password_manager::features::kPasswordGenerationBottomSheet) &&
-      username.empty()) {
+  if (username.empty()) {
     ShowAddUsernameDialog(web_contents);
   } else {
     ShowPasswordSavedMessage(web_contents);
diff --git a/chrome/browser/password_manager/android/generated_password_saved_message_delegate.h b/chrome/browser/password_manager/android/generated_password_saved_message_delegate.h
index f7ad889..79ce324 100644
--- a/chrome/browser/password_manager/android/generated_password_saved_message_delegate.h
+++ b/chrome/browser/password_manager/android/generated_password_saved_message_delegate.h
@@ -27,7 +27,7 @@
 
   GeneratedPasswordSavedMessageDelegate();
   GeneratedPasswordSavedMessageDelegate(
-      base::PassKey<class GeneratedPasswordSavedMessageDelegateTestBase>,
+      base::PassKey<class GeneratedPasswordSavedMessageDelegateTest>,
       CreateAddUsernameDialogBridge add_username_dialog_factory);
   ~GeneratedPasswordSavedMessageDelegate();
   GeneratedPasswordSavedMessageDelegate(
@@ -40,7 +40,7 @@
       std::unique_ptr<password_manager::PasswordFormManagerForUI> saved_form);
 
  private:
-  friend class GeneratedPasswordSavedMessageDelegateTestBase;
+  friend class GeneratedPasswordSavedMessageDelegateTest;
 
   void ShowPasswordSavedMessage(content::WebContents* web_contents);
   void ShowAddUsernameDialog(content::WebContents* web_contents);
diff --git a/chrome/browser/password_manager/android/generated_password_saved_message_delegate_unittest.cc b/chrome/browser/password_manager/android/generated_password_saved_message_delegate_unittest.cc
index a9e8906..7a766ca 100644
--- a/chrome/browser/password_manager/android/generated_password_saved_message_delegate_unittest.cc
+++ b/chrome/browser/password_manager/android/generated_password_saved_message_delegate_unittest.cc
@@ -60,10 +60,10 @@
 
 }  // namespace
 
-class GeneratedPasswordSavedMessageDelegateTestBase
+class GeneratedPasswordSavedMessageDelegateTest
     : public ChromeRenderViewHostTestHarness {
  public:
-  GeneratedPasswordSavedMessageDelegateTestBase();
+  GeneratedPasswordSavedMessageDelegateTest();
 
  protected:
   void SetUp() override;
@@ -91,27 +91,27 @@
   GURL password_form_url_;
 };
 
-GeneratedPasswordSavedMessageDelegateTestBase::
-    GeneratedPasswordSavedMessageDelegateTestBase() {
+GeneratedPasswordSavedMessageDelegateTest::
+    GeneratedPasswordSavedMessageDelegateTest() {
   delegate_ = std::make_unique<GeneratedPasswordSavedMessageDelegate>(
-      base::PassKey<class GeneratedPasswordSavedMessageDelegateTestBase>(),
+      base::PassKey<class GeneratedPasswordSavedMessageDelegateTest>(),
       mock_create_add_username_bridge_factory_.Get());
 }
 
-void GeneratedPasswordSavedMessageDelegateTestBase::SetUp() {
+void GeneratedPasswordSavedMessageDelegateTest::SetUp() {
   ChromeRenderViewHostTestHarness::SetUp();
   NavigateAndCommit(GURL(kDefaultUrl));
   messages::MessageDispatcherBridge::SetInstanceForTesting(
       &message_dispatcher_bridge_);
 }
 
-void GeneratedPasswordSavedMessageDelegateTestBase::TearDown() {
+void GeneratedPasswordSavedMessageDelegateTest::TearDown() {
   messages::MessageDispatcherBridge::SetInstanceForTesting(nullptr);
   ChromeRenderViewHostTestHarness::TearDown();
 }
 
 std::unique_ptr<MockPasswordFormManagerForUI>
-GeneratedPasswordSavedMessageDelegateTestBase::CreateFormManager(
+GeneratedPasswordSavedMessageDelegateTest::CreateFormManager(
     const GURL& password_form_url) {
   password_form_url_ = password_form_url;
   auto form_manager =
@@ -123,14 +123,14 @@
   return form_manager;
 }
 
-void GeneratedPasswordSavedMessageDelegateTestBase::SetUsernameAndPassword(
+void GeneratedPasswordSavedMessageDelegateTest::SetUsernameAndPassword(
     std::u16string username,
     std::u16string password) {
   form_.username_value = std::move(username);
   form_.password_value = std::move(password);
 }
 
-void GeneratedPasswordSavedMessageDelegateTestBase::DismissMessage() {
+void GeneratedPasswordSavedMessageDelegateTest::DismissMessage() {
   EXPECT_CALL(message_dispatcher_bridge_, DismissMessage)
       .WillOnce([](messages::MessageWrapper* message,
                    messages::DismissReason dismiss_reason) {
@@ -142,17 +142,14 @@
 }
 
 std::unique_ptr<AddUsernameDialogBridge>
-GeneratedPasswordSavedMessageDelegateTestBase::CreateAddUsernameBridge(
+GeneratedPasswordSavedMessageDelegateTest::CreateAddUsernameBridge(
     std::unique_ptr<MockJniDelegate> mock_jni) {
   return std::make_unique<AddUsernameDialogBridge>(
-      base::PassKey<class GeneratedPasswordSavedMessageDelegateTestBase>(),
+      base::PassKey<class GeneratedPasswordSavedMessageDelegateTest>(),
       std::move(mock_jni));
 }
 
-TEST_F(GeneratedPasswordSavedMessageDelegateTestBase,
-       TestUsernameAddedCallback) {
-  base::test::ScopedFeatureList feature_list(
-      password_manager::features::kPasswordGenerationBottomSheet);
+TEST_F(GeneratedPasswordSavedMessageDelegateTest, TestUsernameAddedCallback) {
   auto username_bridge =
       CreateAddUsernameBridge(std::make_unique<MockJniDelegate>());
   auto* username_bridge_raw_ptr = username_bridge.get();
@@ -179,18 +176,9 @@
       env, base::android::JavaParamRef<jstring>(env, j_string.obj()));
 }
 
-class GeneratedPasswordSavedMessageDelegateTest
-    : public base::test::WithFeatureOverride,
-      public GeneratedPasswordSavedMessageDelegateTestBase {
- public:
-  GeneratedPasswordSavedMessageDelegateTest()
-      : base::test::WithFeatureOverride(
-            password_manager::features::kPasswordGenerationBottomSheet) {}
-};
-
 // Tests that message properties (title, description, icon, button text) are
 // set correctly.
-TEST_P(GeneratedPasswordSavedMessageDelegateTest, MessagePropertyValues) {
+TEST_F(GeneratedPasswordSavedMessageDelegateTest, MessagePropertyValues) {
   SetUsernameAndPassword(kUsername, kPassword);
   auto form_manager = CreateFormManager(GURL(kDefaultUrl));
 
@@ -211,7 +199,7 @@
   DismissMessage();
 }
 
-TEST_P(GeneratedPasswordSavedMessageDelegateTest,
+TEST_F(GeneratedPasswordSavedMessageDelegateTest,
        AddUsernameDialogIsDisplayedWhenEmptyUsername) {
   auto username_bridge_jni = std::make_unique<MockJniDelegate>();
   auto* username_bridge_jni_raw_ptr = username_bridge_jni.get();
@@ -224,17 +212,11 @@
   SetUsernameAndPassword(u"", kPassword);
   auto form_manager = CreateFormManager(GURL(kDefaultUrl));
 
-  if (base::FeatureList::IsEnabled(
-          password_manager::features::kPasswordGenerationBottomSheet)) {
-    EXPECT_CALL(*username_bridge_jni_raw_ptr, ShowAddUsernameDialog);
-  } else {
-    EXPECT_CALL(message_dispatcher_bridge_, EnqueueMessage);
-  }
-
+  EXPECT_CALL(*username_bridge_jni_raw_ptr, ShowAddUsernameDialog);
   delegate_->ShowPrompt(web_contents(), std::move(form_manager));
 }
 
-TEST_P(GeneratedPasswordSavedMessageDelegateTest,
+TEST_F(GeneratedPasswordSavedMessageDelegateTest,
        DialogIsDismissedOnDelegateDestruction) {
   auto username_bridge_jni = std::make_unique<MockJniDelegate>();
   auto* username_bridge_jni_raw_ptr = username_bridge_jni.get();
@@ -248,14 +230,6 @@
   auto form_manager = CreateFormManager(GURL(kDefaultUrl));
   delegate_->ShowPrompt(web_contents(), std::move(form_manager));
 
-  if (base::FeatureList::IsEnabled(
-          password_manager::features::kPasswordGenerationBottomSheet)) {
-    EXPECT_CALL(*username_bridge_jni_raw_ptr, Dismiss);
-  } else {
-    EXPECT_CALL(message_dispatcher_bridge_, DismissMessage);
-  }
+  EXPECT_CALL(*username_bridge_jni_raw_ptr, Dismiss);
   delegate_.reset();
 }
-
-INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(
-    GeneratedPasswordSavedMessageDelegateTest);
diff --git a/chrome/browser/password_manager/android/password_generation_controller_impl.cc b/chrome/browser/password_manager/android/password_generation_controller_impl.cc
index 2c22b8e..5fabd82 100644
--- a/chrome/browser/password_manager/android/password_generation_controller_impl.cc
+++ b/chrome/browser/password_manager/android/password_generation_controller_impl.cc
@@ -16,7 +16,6 @@
 #include "chrome/browser/keyboard_accessory/android/accessory_sheet_enums.h"
 #include "chrome/browser/keyboard_accessory/android/manual_filling_controller.h"
 #include "chrome/browser/keyboard_accessory/android/password_accessory_controller.h"
-#include "chrome/browser/password_manager/android/password_generation_dialog_view_interface.h"
 #include "chrome/browser/password_manager/android/password_infobar_utils.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/touch_to_fill/password_manager/password_generation/android/touch_to_fill_password_generation_bridge_impl.h"
@@ -110,12 +109,7 @@
     return;
   generation_element_data_ =
       std::make_unique<PasswordGenerationElementData>(ui_data);
-  if (!base::FeatureList::IsEnabled(
-          password_manager::features::kPasswordGenerationBottomSheet)) {
-    ShowDialog(PasswordGenerationType::kManual);
-  } else {
-    ShowBottomSheet(PasswordGenerationType::kManual);
-  }
+  ShowBottomSheet(PasswordGenerationType::kManual);
 }
 
 void PasswordGenerationControllerImpl::FocusedInputChanged(
@@ -139,12 +133,7 @@
     manual_generation_requested_ = true;
     client_->GeneratePassword(type);
   } else {
-    if (!base::FeatureList::IsEnabled(
-            password_manager::features::kPasswordGenerationBottomSheet)) {
-      ShowDialog(PasswordGenerationType::kAutomatic);
-    } else {
-      ShowBottomSheet(PasswordGenerationType::kAutomatic);
-    }
+    ShowBottomSheet(PasswordGenerationType::kAutomatic);
   }
   ResetPasswordGenerationDismissBottomSheetCount();
 }
@@ -194,7 +183,6 @@
     content::WebContents* web_contents,
     password_manager::PasswordManagerClient* client,
     base::WeakPtr<ManualFillingController> manual_filling_controller,
-    CreateDialogFactory create_dialog_factory,
     CreateTouchToFillGenerationControllerFactory
         create_touch_to_fill_generation_controller) {
   DCHECK(web_contents) << "Need valid WebContents to attach controller to!";
@@ -205,7 +193,7 @@
       UserDataKey(),
       base::WrapUnique(new PasswordGenerationControllerImpl(
           web_contents, client, std::move(manual_filling_controller),
-          create_dialog_factory, create_touch_to_fill_generation_controller)));
+          create_touch_to_fill_generation_controller)));
 }
 
 PasswordGenerationControllerImpl::PasswordGenerationControllerImpl(
@@ -214,7 +202,6 @@
           web_contents,
           ChromePasswordManagerClient::FromWebContents(web_contents),
           /*manual_filling_controller=*/nullptr,
-          base::BindRepeating(&PasswordGenerationDialogViewInterface::Create),
           base::BindRepeating(&PasswordGenerationControllerImpl::
                                   CreateTouchToFillGenerationController,
                               base::Unretained(this))) {}
@@ -223,7 +210,6 @@
     content::WebContents* web_contents,
     password_manager::PasswordManagerClient* client,
     base::WeakPtr<ManualFillingController> manual_filling_controller,
-    CreateDialogFactory create_dialog_factory,
     CreateTouchToFillGenerationControllerFactory
         create_touch_to_fill_generation_controller)
     : content::WebContentsObserver(web_contents),
@@ -231,7 +217,6 @@
           *web_contents),
       client_(client),
       manual_filling_controller_(std::move(manual_filling_controller)),
-      create_dialog_factory_(create_dialog_factory),
       create_touch_to_fill_generation_controller_(
           create_touch_to_fill_generation_controller) {}
 
@@ -260,38 +245,10 @@
       manual_filling_controller);
 }
 
-void PasswordGenerationControllerImpl::ShowDialog(PasswordGenerationType type) {
-  if (!active_frame_driver_ || dialog_view_) {
-    return;
-  }
-
-  // TODO(crbug.com/40597876): Add a test helper that sets this up correctly.
-  if (!generation_element_data_) {
-    /* This can currently happen in integration tests that are iniated from
-    the java side. */
-    return;
-  }
-
-  dialog_view_ = create_dialog_factory_.Run(this);
-
-  std::u16string password =
-      active_frame_driver_->GetPasswordGenerationHelper()->GeneratePassword(
-          GetWebContents().GetLastCommittedURL().DeprecatedGetOriginAsURL(),
-          generation_element_data_->form_signature,
-          generation_element_data_->field_signature,
-          generation_element_data_->max_password_length);
-  dialog_view_->Show(password, active_frame_driver_, type);
-}
-
 bool PasswordGenerationControllerImpl::TryToShowGenerationTouchToFill(
     bool has_saved_credentials) {
   CHECK(touch_to_fill_generation_state_ != TouchToFillState::kIsShowing);
 
-  if (!base::FeatureList::IsEnabled(
-          password_manager::features::kPasswordGenerationBottomSheet)) {
-    return false;
-  }
-
   if (has_saved_credentials) {
     password_manager::metrics_util::
         LogTouchToFillPasswordGenerationTriggerOutcome(
@@ -365,9 +322,7 @@
         autofill::AccessoryAction::GENERATE_PASSWORD_AUTOMATIC);
   active_frame_driver_.reset();
   generation_element_data_.reset();
-  dialog_view_.reset();
   manual_generation_requested_ = false;
-  // TODO (crbug.com/1421753): Do we need to hide the bottom sheet here?
 }
 
 void PasswordGenerationControllerImpl::HideBottomSheetIfNeeded() {
diff --git a/chrome/browser/password_manager/android/password_generation_controller_impl.h b/chrome/browser/password_manager/android/password_generation_controller_impl.h
index 5df727cc..d37b204 100644
--- a/chrome/browser/password_manager/android/password_generation_controller_impl.h
+++ b/chrome/browser/password_manager/android/password_generation_controller_impl.h
@@ -17,7 +17,6 @@
 #include "ui/gfx/geometry/rect.h"
 
 class ManualFillingController;
-class PasswordGenerationDialogViewInterface;
 class TouchToFillPasswordGenerationController;
 struct PasswordGenerationElementData;
 
@@ -37,8 +36,6 @@
       public content::WebContentsObserver,
       public content::WebContentsUserData<PasswordGenerationControllerImpl> {
  public:
-  using CreateDialogFactory = base::RepeatingCallback<std::unique_ptr<
-      PasswordGenerationDialogViewInterface>(PasswordGenerationController*)>;
   using CreateTouchToFillGenerationControllerFactory = base::RepeatingCallback<
       std::unique_ptr<TouchToFillPasswordGenerationController>()>;
 
@@ -94,7 +91,6 @@
       content::WebContents* web_contents,
       password_manager::PasswordManagerClient* client,
       base::WeakPtr<ManualFillingController> manual_filling_controller,
-      CreateDialogFactory create_dialog_callback,
       CreateTouchToFillGenerationControllerFactory
           create_touch_to_fill_generation_controller);
 
@@ -116,7 +112,6 @@
       content::WebContents* web_contents,
       password_manager::PasswordManagerClient* client,
       base::WeakPtr<ManualFillingController> manual_filling_controller,
-      CreateDialogFactory create_dialog_callback,
       CreateTouchToFillGenerationControllerFactory
           create_touch_to_fill_generation_controller);
 
@@ -176,12 +171,6 @@
   std::unique_ptr<TouchToFillPasswordGenerationController>
       touch_to_fill_generation_controller_;
 
-  // Modal dialog view meant to display the generated password.
-  std::unique_ptr<PasswordGenerationDialogViewInterface> dialog_view_;
-
-  // Creation callback for the modal dialog view meant to facilitate testing.
-  CreateDialogFactory create_dialog_factory_;
-
   // Creation callback for the password generation bottom sheet controller to
   // facilitate testing.
   CreateTouchToFillGenerationControllerFactory
diff --git a/chrome/browser/password_manager/android/password_generation_controller_impl_unittest.cc b/chrome/browser/password_manager/android/password_generation_controller_impl_unittest.cc
index 80784b7..34ebb59 100644
--- a/chrome/browser/password_manager/android/password_generation_controller_impl_unittest.cc
+++ b/chrome/browser/password_manager/android/password_generation_controller_impl_unittest.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 #include "chrome/browser/password_manager/android/password_generation_controller_impl.h"
-#include "base/functional/bind.h"
-#include "base/memory/raw_ptr.h"
 
 #include <map>
 #include <memory>
 #include <utility>
 
+#include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
@@ -17,7 +17,6 @@
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/keyboard_accessory/android/accessory_sheet_enums.h"
 #include "chrome/browser/keyboard_accessory/test_utils/android/mock_manual_filling_controller.h"
-#include "chrome/browser/password_manager/android/password_generation_dialog_view_interface.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/touch_to_fill/password_manager/password_generation/android/fake_touch_to_fill_password_generation_bridge.h"
 #include "chrome/browser/touch_to_fill/password_manager/password_generation/android/mock_touch_to_fill_password_generation_bridge.h"
@@ -97,28 +96,6 @@
   return mock_password_store_.get();
 }
 
-// Mock modal dialog view used to bypass the need of a valid top level window.
-class MockPasswordGenerationDialogView
-    : public PasswordGenerationDialogViewInterface {
- public:
-  MockPasswordGenerationDialogView() = default;
-
-  MOCK_METHOD(void,
-              Show,
-              (std::u16string&,
-               base::WeakPtr<password_manager::ContentPasswordManagerDriver>,
-               PasswordGenerationType),
-              (override));
-  MOCK_METHOD(void, Destroy, (), ());
-
-  MockPasswordGenerationDialogView(const MockPasswordGenerationDialogView&) =
-      delete;
-  MockPasswordGenerationDialogView& operator=(
-      const MockPasswordGenerationDialogView&) = delete;
-
-  ~MockPasswordGenerationDialogView() override { Destroy(); }
-};
-
 PasswordGenerationUIData GetTestGenerationUIData1() {
   PasswordGenerationUIData data;
 
@@ -182,9 +159,6 @@
             password_manager_driver_.get(), &test_autofill_client_,
             test_pwd_manager_client_.get());
 
-    mock_dialog_ =
-        std::make_unique<NiceMock<MockPasswordGenerationDialogView>>();
-
     ON_CALL(create_ttf_generation_controller_, Run).WillByDefault([this]() {
       return controller()->CreateTouchToFillGenerationControllerForTesting(
           std::make_unique<MockTouchToFillPasswordGenerationBridge>(),
@@ -193,7 +167,7 @@
 
     PasswordGenerationControllerImpl::CreateForWebContentsForTesting(
         web_contents(), test_pwd_manager_client_.get(),
-        mock_manual_filling_controller_.AsWeakPtr(), mock_dialog_factory_.Get(),
+        mock_manual_filling_controller_.AsWeakPtr(),
         create_ttf_generation_controller_.Get());
     EXPECT_CALL(mock_manual_filling_controller_,
                 OnAccessoryActionAvailabilityChanged(
@@ -217,12 +191,6 @@
     return another_password_manager_driver_->AsWeakPtrImpl();
   }
 
-  const base::MockCallback<
-      PasswordGenerationControllerImpl::CreateDialogFactory>&
-  mock_dialog_factory() {
-    return mock_dialog_factory_;
-  }
-
   TestingPrefServiceSimple* pref_service() { return &pref_service_; }
 
  protected:
@@ -231,15 +199,11 @@
   std::unique_ptr<ContentPasswordManagerDriver> password_manager_driver_;
   std::unique_ptr<ContentPasswordManagerDriver>
       another_password_manager_driver_;
-  std::unique_ptr<NiceMock<MockPasswordGenerationDialogView>> mock_dialog_;
   base::MockCallback<CreateTouchToFillGenerationControllerFactory>
       create_ttf_generation_controller_;
   base::test::ScopedFeatureList feature_list_;
 
  private:
-  NiceMock<
-      base::MockCallback<PasswordGenerationControllerImpl::CreateDialogFactory>>
-      mock_dialog_factory_;
   std::unique_ptr<password_manager::PasswordManager> password_manager_;
   std::unique_ptr<password_manager::PasswordAutofillManager>
       password_autofill_manager_;
@@ -419,74 +383,13 @@
             controller()->GetActiveFrameDriver().get());
 }
 
-TEST_F(PasswordGenerationControllerTest, HidesDialogWhenFocusChanges) {
-  feature_list_.InitAndDisableFeature(
-      password_manager::features::kPasswordGenerationBottomSheet);
-  controller()->OnGenerationRequested(PasswordGenerationType::kManual);
-
-  NiceMock<MockPasswordGenerationDialogView>* raw_dialog_view =
-      mock_dialog_.get();
-  EXPECT_CALL(mock_dialog_factory(), Run)
-      .WillOnce(Return(ByMove(std::move(mock_dialog_))));
-  EXPECT_CALL(*raw_dialog_view,
-              Show(_, PointsToSameAddress(password_manager_driver_.get()),
-                   PasswordGenerationType::kManual));
-  controller()->ShowManualGenerationDialog(password_manager_driver_.get(),
-                                           GetTestGenerationUIData1());
-  EXPECT_CALL(mock_manual_filling_controller_,
-              OnAccessoryActionAvailabilityChanged(
-                  ShouldShowAction(false),
-                  autofill::AccessoryAction::GENERATE_PASSWORD_AUTOMATIC));
-  EXPECT_CALL(*raw_dialog_view, Destroy());
-  controller()->FocusedInputChanged(FocusedFieldType::kFillableUsernameField,
-                                    non_active_driver());
-  Mock::VerifyAndClearExpectations(raw_dialog_view);
-}
-
-TEST_F(PasswordGenerationControllerTest, ShowManualDialogForActiveFrame) {
-  feature_list_.InitAndDisableFeature(
-      password_manager::features::kPasswordGenerationBottomSheet);
-  controller()->OnGenerationRequested(PasswordGenerationType::kManual);
-
-  NiceMock<MockPasswordGenerationDialogView>* raw_dialog_view =
-      mock_dialog_.get();
-  EXPECT_CALL(mock_dialog_factory(), Run)
-      .WillOnce(Return(ByMove(std::move(mock_dialog_))));
-  EXPECT_CALL(*raw_dialog_view,
-              Show(_, PointsToSameAddress(password_manager_driver_.get()),
-                   PasswordGenerationType::kManual));
-  controller()->ShowManualGenerationDialog(password_manager_driver_.get(),
-                                           GetTestGenerationUIData1());
-}
-
 TEST_F(PasswordGenerationControllerTest,
        RejectShowManualDialogForNonActiveFrame) {
-  EXPECT_CALL(mock_dialog_factory(), Run).Times(0);
+  EXPECT_CALL(create_ttf_generation_controller_, Run).Times(0);
   controller()->ShowManualGenerationDialog(
       another_password_manager_driver_.get(), GetTestGenerationUIData1());
 }
 
-TEST_F(PasswordGenerationControllerTest, DontShowDialogIfAlreadyShown) {
-  feature_list_.InitAndDisableFeature(
-      password_manager::features::kPasswordGenerationBottomSheet);
-  controller()->OnGenerationRequested(PasswordGenerationType::kManual);
-
-  NiceMock<MockPasswordGenerationDialogView>* raw_dialog_view =
-      mock_dialog_.get();
-  EXPECT_CALL(mock_dialog_factory(), Run)
-      .WillOnce(Return(ByMove(std::move(mock_dialog_))));
-
-  EXPECT_CALL(*raw_dialog_view,
-              Show(_, PointsToSameAddress(password_manager_driver_.get()),
-                   PasswordGenerationType::kManual));
-  controller()->ShowManualGenerationDialog(password_manager_driver_.get(),
-                                           GetTestGenerationUIData1());
-
-  EXPECT_CALL(mock_dialog_factory(), Run).Times(0);
-  controller()->ShowManualGenerationDialog(password_manager_driver_.get(),
-                                           GetTestGenerationUIData1());
-}
-
 TEST_F(PasswordGenerationControllerTest, DontShowManualDialogIfFocusChanged) {
   controller()->OnGenerationRequested(PasswordGenerationType::kManual);
 
@@ -496,15 +399,13 @@
                   autofill::AccessoryAction::GENERATE_PASSWORD_AUTOMATIC));
   controller()->FocusedInputChanged(FocusedFieldType::kFillablePasswordField,
                                     non_active_driver());
-  EXPECT_CALL(mock_dialog_factory(), Run).Times(0);
+  EXPECT_CALL(create_ttf_generation_controller_, Run).Times(0);
   controller()->ShowManualGenerationDialog(password_manager_driver_.get(),
                                            GetTestGenerationUIData1());
 }
 
 TEST_F(PasswordGenerationControllerTest,
        DoesNotCallKeyboardAccessoryWhenGenerationBottomSheetRequired) {
-  base::test::ScopedFeatureList feature_list(
-      password_manager::features::kPasswordGenerationBottomSheet);
   base::HistogramTester histogram_tester;
 
   auto ttf_password_generation_bridge =
@@ -538,8 +439,6 @@
 
 TEST_F(PasswordGenerationControllerTest,
        DoesNotCallKeyboardAccessoryWhenBottomSheetIsDisplayed) {
-  base::test::ScopedFeatureList feature_list(
-      password_manager::features::kPasswordGenerationBottomSheet);
   controller()->OnAutomaticGenerationAvailable(
       active_driver(), GetTestGenerationUIData1(),
       /*has_saved_credentials=*/false, gfx::RectF(100, 20));
@@ -561,8 +460,6 @@
 
 TEST_F(PasswordGenerationControllerTest,
        CallsKeyboardAccessoryWhenGenerationBottomSheetFailedToShow) {
-  base::test::ScopedFeatureList feature_list(
-      password_manager::features::kPasswordGenerationBottomSheet);
   base::HistogramTester histogram_tester;
 
   auto ttf_password_generation_bridge =
@@ -589,8 +486,6 @@
 
 TEST_F(PasswordGenerationControllerTest,
        DoesNotShowGenerationBottomSheetIfSavedPasswordsAvailable) {
-  base::test::ScopedFeatureList feature_list(
-      password_manager::features::kPasswordGenerationBottomSheet);
   base::HistogramTester histogram_tester;
 
   // Password generation bottom sheet must not show up. Keyboard accessory
@@ -610,8 +505,6 @@
 
 TEST_F(PasswordGenerationControllerTest,
        DoesNotShowGenerationBottomSheetIfDismissCountAtLeast4) {
-  base::test::ScopedFeatureList feature_list(
-      password_manager::features::kPasswordGenerationBottomSheet);
   base::HistogramTester histogram_tester;
 
   pref_service()->SetInteger(
@@ -634,8 +527,6 @@
 
 TEST_F(PasswordGenerationControllerTest,
        CallsKeyboardAccessoryAfterBottomSheetDismissed) {
-  base::test::ScopedFeatureList feature_list(
-      password_manager::features::kPasswordGenerationBottomSheet);
   base::HistogramTester histogram_tester;
   auto ttf_password_generation_bridge =
       std::make_unique<FakeTouchToFillPasswordGenerationBridge>();
@@ -697,8 +588,6 @@
 
 TEST_F(PasswordGenerationControllerTest,
        ShowsBottomSheetWhenManualGenerationRequestedWithFeatureOn) {
-  base::test::ScopedFeatureList feature_list(
-      password_manager::features::kPasswordGenerationBottomSheet);
   controller()->OnGenerationRequested(PasswordGenerationType::kManual);
 
   EXPECT_CALL(create_ttf_generation_controller_, Run);
@@ -708,8 +597,6 @@
 
 TEST_F(PasswordGenerationControllerTest,
        ShowsBottomSheetWhenAutomaticGenerationRequestedWithFeatureOn) {
-  base::test::ScopedFeatureList feature_list(
-      password_manager::features::kPasswordGenerationBottomSheet);
   controller()->OnAutomaticGenerationAvailable(
       active_driver(), GetTestGenerationUIData1(),
       /*has_saved_credentials=*/false, gfx::RectF(100, 20));
diff --git a/chrome/browser/password_manager/android/password_generation_dialog_view_interface.h b/chrome/browser/password_manager/android/password_generation_dialog_view_interface.h
deleted file mode 100644
index bd6dd38..0000000
--- a/chrome/browser/password_manager/android/password_generation_dialog_view_interface.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_PASSWORD_MANAGER_ANDROID_PASSWORD_GENERATION_DIALOG_VIEW_INTERFACE_H_
-#define CHROME_BROWSER_PASSWORD_MANAGER_ANDROID_PASSWORD_GENERATION_DIALOG_VIEW_INTERFACE_H_
-
-#include <string>
-
-#include "base/memory/weak_ptr.h"
-#include "components/autofill/core/common/password_generation_util.h"
-class PasswordGenerationController;
-
-namespace password_manager {
-class ContentPasswordManagerDriver;
-}  // namespace password_manager
-
-class PasswordGenerationDialogViewInterface {
- public:
-  virtual ~PasswordGenerationDialogViewInterface() = default;
-
-  // Called to show the dialog. |password| is the generated password.
-  // TODO(crbug.com/40572788): Don't pass in |target_frame_driver|.
-  // This is no longer needed since any focus change now hides the dialog,
-  // ensuring that it can't be interacted with if the focus changes.
-  // |manual| whether the dialog is shown for manual or automatic generation.
-  // Used for metrics.
-  virtual void Show(
-      std::u16string& password,
-      base::WeakPtr<password_manager::ContentPasswordManagerDriver>
-          target_frame_driver,
-      autofill::password_generation::PasswordGenerationType type) = 0;
-
- private:
-  friend class PasswordGenerationControllerImpl;
-
-  // Factory function used to create a concrete instance of this view.
-  static std::unique_ptr<PasswordGenerationDialogViewInterface> Create(
-      PasswordGenerationController* controller);
-};
-
-#endif  // CHROME_BROWSER_PASSWORD_MANAGER_ANDROID_PASSWORD_GENERATION_DIALOG_VIEW_INTERFACE_H_
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index f77c419..fa33b7a2 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -1226,14 +1226,10 @@
     autofill::FieldRendererId field_renderer_id,
     const std::u16string& password_value) {
 #if BUILDFLAG(IS_ANDROID)
-  if (base::FeatureList::IsEnabled(
-          password_manager::features::kPasswordGenerationBottomSheet)) {
-    // The popup obscures part of the page and the bottom sheet already displays
-    // the same information before generation.
-    return;
-  }
-#endif  // BUILDFLAG(IS_ANDROID)
-
+  // The popup obscures part of the page and the bottom sheet already displays
+  // the same information before generation.
+  return;
+#else
   content::RenderFrameHost* rfh =
       password_generation_driver_receivers_.GetCurrentTargetFrame();
   auto* driver = GetDriverFactory()->GetDriverForFrame(rfh);
@@ -1262,6 +1258,7 @@
   popup_controller_->UpdateGeneratedPassword(password_value);
   popup_controller_->Show(
       PasswordGenerationPopupController::kEditGeneratedPassword);
+#endif  // BUILDFLAG(IS_ANDROID)
 }
 
 void ChromePasswordManagerClient::PasswordGenerationRejectedByTyping() {
diff --git a/chrome/browser/password_manager/password_store_backend_factory.cc b/chrome/browser/password_manager/password_store_backend_factory.cc
index 22aacc07..0981e1f 100644
--- a/chrome/browser/password_manager/password_store_backend_factory.cc
+++ b/chrome/browser/password_manager/password_store_backend_factory.cc
@@ -147,15 +147,12 @@
 #endif  // !BUILDFLAG(USE_LOGIN_DATABASE_AS_BACKEND)
 
   auto is_profile_db_empty_cb =
-      base::BindPostTaskToCurrentDefault(base::BindRepeating(
 #if BUILDFLAG(IS_ANDROID)
+      base::BindPostTaskToCurrentDefault(base::BindRepeating(
           &password_manager::SetEmptyStorePref, prefs, backend->AsWeakPtr(),
           password_manager::prefs::kEmptyProfileStoreLoginDatabase));
 #else
-          &password_manager::SetAutofillableCredentialsStorePref, prefs,
-          backend->AsWeakPtr(),
-          password_manager::prefs::
-              kAutofillableCredentialsProfileStoreLoginDatabase));
+      base::NullCallback();
 #endif
   login_db_ptr->SetIsEmptyCb(std::move(is_profile_db_empty_cb));
 
@@ -171,9 +168,6 @@
       password_manager::CreateLoginDatabaseForAccountStorage(
           login_db_directory));
   std::unique_ptr<PasswordStoreBackend> backend;
-#if !BUILDFLAG(IS_ANDROID)
-  password_manager::LoginDatabase* login_db_ptr = login_db.get();
-#endif  // !BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(USE_LOGIN_DATABASE_AS_BACKEND)
   backend = std::make_unique<PasswordStoreBuiltInBackend>(
@@ -199,16 +193,5 @@
           prefs, /*password_affiliation_adapter=*/nullptr,
           password_manager::kAccountStore));
 #endif
-
-#if !BUILDFLAG(IS_ANDROID)
-  auto is_account_db_empty_cb =
-      base::BindPostTaskToCurrentDefault(base::BindRepeating(
-          &password_manager::SetAutofillableCredentialsStorePref, prefs,
-          backend->AsWeakPtr(),
-          password_manager::prefs::
-              kAutofillableCredentialsAccountStoreLoginDatabase));
-  login_db_ptr->SetIsEmptyCb(std::move(is_account_db_empty_cb));
-#endif  // !BUILDFLAG(IS_ANDROID)
-
   return backend;
 }
diff --git a/chrome/browser/policy/BUILD.gn b/chrome/browser/policy/BUILD.gn
index e63c57861..58a3a2d1 100644
--- a/chrome/browser/policy/BUILD.gn
+++ b/chrome/browser/policy/BUILD.gn
@@ -192,6 +192,7 @@
     "test/certificate_transparency_policy_browsertest.cc",
     "test/force_permission_policy_unload_default_enabled_policy_browsertest.cc",
     "test/hsts_policy_browsertest.cc",
+    "test/keyboard_focusable_scollers_policy_browsertest.cc",
     "test/mutation_events_policy_browsertest.cc",
     "test/network_prediction_policy_browsertest.cc",
     "test/policy_statistics_collector_browsertest.cc",
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 193362b..b9f6ce5 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -2102,6 +2102,9 @@
   { key::kBeforeunloadEventCancelByPreventDefaultEnabled,
     policy_prefs::kBeforeunloadEventCancelByPreventDefaultEnabled,
     base::Value::Type::BOOLEAN},
+  { key::kKeyboardFocusableScrollersEnabled,
+    policy_prefs::kKeyboardFocusableScrollersEnabled,
+    base::Value::Type::BOOLEAN},
   { key::kIPv6ReachabilityOverrideEnabled,
     prefs::kIPv6ReachabilityOverrideEnabled,
     base::Value::Type::BOOLEAN },
diff --git a/chrome/browser/policy/test/keyboard_focusable_scollers_policy_browsertest.cc b/chrome/browser/policy/test/keyboard_focusable_scollers_policy_browsertest.cc
new file mode 100644
index 0000000..99c6b829
--- /dev/null
+++ b/chrome/browser/policy/test/keyboard_focusable_scollers_policy_browsertest.cc
@@ -0,0 +1,140 @@
+// 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/test/scoped_feature_list.h"
+#include "chrome/browser/policy/policy_test_utils.h"
+#include "components/policy/policy_constants.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_utils.h"
+#include "third_party/blink/public/common/features.h"
+
+namespace policy {
+
+enum class Policy {
+  kDefault,
+  kTrue,
+  kFalse,
+};
+
+class KeyboardFocusableScrollersEnabledPolicyBrowserTest
+    : public PolicyTest,
+      public ::testing::WithParamInterface<Policy> {
+ public:
+  static std::string DescribeParams(
+      const ::testing::TestParamInfo<ParamType>& info) {
+    switch (info.param) {
+      case Policy::kDefault:
+        return "Default";
+      case Policy::kTrue:
+        return "True";
+      case Policy::kFalse:
+        return "False";
+    }
+  }
+
+ protected:
+  base::test::ScopedFeatureList feature_list_;
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    feature_list_.InitAndEnableFeature(
+        blink::features::kKeyboardFocusableScrollers);
+  }
+
+  void SetUpInProcessBrowserTestFixture() override {
+    PolicyTest::SetUpInProcessBrowserTestFixture();
+
+    if (GetParam() == Policy::kDefault) {
+      return;
+    }
+    PolicyMap policies;
+    SetPolicy(&policies, key::kKeyboardFocusableScrollersEnabled,
+              base::Value(GetParam() == Policy::kTrue));
+    UpdateProviderPolicy(policies);
+  }
+};
+
+IN_PROC_BROWSER_TEST_P(KeyboardFocusableScrollersEnabledPolicyBrowserTest,
+                       PolicyIsFollowed) {
+  // Both true and the default (no parameter) should be enabled.
+  const bool expect_disabled = GetParam() == Policy::kFalse;
+
+  ASSERT_TRUE(embedded_test_server()->Start());
+  const GURL url(embedded_test_server()->GetURL("/empty.html"));
+  ASSERT_TRUE(NavigateToUrl(url, this));
+
+  content::DOMMessageQueue message_queue(
+      chrome_test_utils::GetActiveWebContents(this));
+  content::ExecuteScriptAsync(chrome_test_utils::GetActiveWebContents(this),
+                              R"(
+    const scroller = document.createElement("div");
+    scroller.style = 'grey; width: 100px; height: 100px; overflow: auto';
+    const content = document.createElement("div");
+    content.style = 'width: 200px; height: 200px';
+    scroller.appendChild(content);
+    document.body.appendChild(scroller);
+    scroller.focus();
+    if (document.activeElement == scroller) {
+      window.domAutomationController.send(true);
+    } else {
+      window.domAutomationController.send(false);
+    }
+  )");
+  std::string message;
+  EXPECT_TRUE(message_queue.WaitForMessage(&message));
+  EXPECT_TRUE(message == "true" || message == "false");
+  EXPECT_EQ(message == "false", expect_disabled);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    /* no prefix */,
+    KeyboardFocusableScrollersEnabledPolicyBrowserTest,
+    ::testing::Values(Policy::kDefault, Policy::kTrue, Policy::kFalse),
+    &KeyboardFocusableScrollersEnabledPolicyBrowserTest::DescribeParams);
+
+class KeyboardFocusableScrollersDisabledPolicyBrowserTest
+    : public KeyboardFocusableScrollersEnabledPolicyBrowserTest {
+ protected:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    feature_list_.Reset();
+    feature_list_.InitAndDisableFeature(
+        blink::features::kKeyboardFocusableScrollers);
+  }
+};
+
+IN_PROC_BROWSER_TEST_P(KeyboardFocusableScrollersDisabledPolicyBrowserTest,
+                       PolicyIsFollowed) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  const GURL url(embedded_test_server()->GetURL("/empty.html"));
+  ASSERT_TRUE(NavigateToUrl(url, this));
+
+  content::DOMMessageQueue message_queue(
+      chrome_test_utils::GetActiveWebContents(this));
+  content::ExecuteScriptAsync(chrome_test_utils::GetActiveWebContents(this),
+                              R"(
+    const scroller = document.createElement("div");
+    scroller.style = 'grey; width: 100px; height: 100px; overflow: auto';
+    const content = document.createElement("div");
+    content.style = 'width: 200px; height: 200px';
+    scroller.appendChild(content);
+    document.body.appendChild(scroller);
+    scroller.focus();
+    if (document.activeElement == scroller) {
+      window.domAutomationController.send(true);
+    } else {
+      window.domAutomationController.send(false);
+    }
+  )");
+  std::string message;
+  EXPECT_TRUE(message_queue.WaitForMessage(&message));
+  // Feature is disabled, expect behavior to be disabled.
+  EXPECT_TRUE(message == "false");
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    /* no prefix */,
+    KeyboardFocusableScrollersDisabledPolicyBrowserTest,
+    ::testing::Values(Policy::kDefault, Policy::kTrue, Policy::kFalse),
+    &KeyboardFocusableScrollersDisabledPolicyBrowserTest::DescribeParams);
+
+}  // namespace policy
diff --git a/chrome/browser/profiles/profile_window.cc b/chrome/browser/profiles/profile_window.cc
index dfbd8d0..79a9b8d 100644
--- a/chrome/browser/profiles/profile_window.cc
+++ b/chrome/browser/profiles/profile_window.cc
@@ -10,7 +10,6 @@
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
-#include "base/functional/callback_helpers.h"
 #include "base/location.h"
 #include "base/metrics/user_metrics.h"
 #include "base/strings/escape.h"
@@ -43,6 +42,7 @@
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/buildflags/buildflags.h"
+#include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 #include "chrome/browser/extensions/extension_service.h"
@@ -93,14 +93,6 @@
   }
 }
 
-// Runs `callback` with a nullptr browser. Note: this takes the callback by
-// reference, so that this can be used without consuming the callback.
-void RunWithNullBrowser(base::OnceCallback<void(Browser*)>& callback) {
-  if (callback) {
-    std::move(callback).Run(nullptr);
-  }
-}
-
 }  // namespace
 
 namespace profiles {
@@ -142,9 +134,12 @@
   // `error_closure_runner` runs the callback  with nullptr to signal an error
   // if the function reaches a return statement without consuming callback. If
   // the callback is consumed by std::move(), then `callback` will be empty
-  // after that and the closure runner does nothing.
-  base::ScopedClosureRunner error_closure_runner(
-      base::BindOnce(&RunWithNullBrowser, std::ref(callback)));
+  // after that and the scoped cleanup does nothing.
+  absl::Cleanup error_closure_runner([&callback] {
+    if (callback) {
+      std::move(callback).Run(nullptr);
+    }
+  });
   chrome::startup::IsProcessStartup process_startup =
       chrome::startup::IsProcessStartup::kNo;
   chrome::startup::IsFirstRun is_first_run = chrome::startup::IsFirstRun::kNo;
diff --git a/chrome/browser/resources/ash/settings/os_languages_page/input_page.html b/chrome/browser/resources/ash/settings/os_languages_page/input_page.html
index a44f7b6f..e59b8cb 100644
--- a/chrome/browser/resources/ash/settings/os_languages_page/input_page.html
+++ b/chrome/browser/resources/ash/settings/os_languages_page/input_page.html
@@ -172,11 +172,12 @@
           aria-labelledby$="language-[[index]]" role="button">
         <div class="start" id="language-[[index]]" aria-hidden="true">
           <div class="display-name">[[item.displayName]]</div>
-          <div class="explain-selected"
-              hidden="[[!isCurrentInputMethod_(
-                  item.id, languages.inputMethods.currentId)]]">
-            $i18n{inputMethodEnabled}
-          </div>
+          <template is="dom-if" if="[[isCurrentInputMethod_(
+            item.id, languages.inputMethods.currentId)]]">
+            <div class="explain-selected">
+              $i18n{inputMethodEnabled}
+            </div>
+          </template>
           <template is="dom-if" if="[[shouldShowLanguagePackError_(
                   item.id, languagePacksInSettingsEnabled_,
                   languages.inputMethods.imeLanguagePackStatus.*)]]">
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.html b/chrome/browser/resources/settings/appearance_page/appearance_page.html
index e815d49..8d4b661 100644
--- a/chrome/browser/resources/settings/appearance_page/appearance_page.html
+++ b/chrome/browser/resources/settings/appearance_page/appearance_page.html
@@ -142,7 +142,7 @@
             label="$i18n{showBookmarksBar}">
         </settings-toggle-button>
 
-        <settings-toggle-button id="showSavedTabGroups"
+        <settings-toggle-button class="hr" id="showSavedTabGroups"
             hidden="[[!showSavedTabGroupsInBookmarksBar_]]"
             pref="{{prefs.bookmark_bar.show_tab_groups}}"
             label="$i18n{showTabGroupsInBookmarksBar}">
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_message_handler_android.cc b/chrome/browser/sharing/click_to_call/click_to_call_message_handler_android.cc
index 0d1fe54c..915e853 100644
--- a/chrome/browser/sharing/click_to_call/click_to_call_message_handler_android.cc
+++ b/chrome/browser/sharing/click_to_call/click_to_call_message_handler_android.cc
@@ -6,7 +6,6 @@
 
 #include "base/android/jni_string.h"
 #include "base/check.h"
-#include "base/functional/callback_helpers.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/strcat.h"
 #include "base/trace_event/trace_event.h"
@@ -14,6 +13,7 @@
 #include "chrome/browser/sharing/click_to_call/click_to_call_utils.h"
 #include "chrome/browser/sharing/proto/click_to_call_message.pb.h"
 #include "chrome/browser/sharing/proto/sharing_message.pb.h"
+#include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 #include "url/gurl.h"
 
 ClickToCallMessageHandler::ClickToCallMessageHandler() = default;
@@ -25,8 +25,9 @@
     SharingMessageHandler::DoneCallback done_callback) {
   DCHECK(message.has_click_to_call_message());
   TRACE_EVENT0("sharing", "ClickToCallMessageHandler::OnMessage");
-  base::ScopedClosureRunner runner(
-      base::BindOnce(std::move(done_callback), /*response=*/nullptr));
+  absl::Cleanup response_runner = [&done_callback] {
+    std::move(done_callback).Run(/*response=*/nullptr);
+  };
 
   std::string phone_number = message.click_to_call_message().phone_number();
   GURL phone_url(base::StrCat({"tel:", phone_number}));
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc
index b2b16a9..b326808 100644
--- a/chrome/browser/sync/chrome_sync_client.cc
+++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -65,7 +65,6 @@
 #include "components/data_sharing/public/features.h"
 #include "components/desks_storage/core/desk_sync_service.h"
 #include "components/history/core/browser/history_service.h"
-#include "components/metrics/demographics/user_demographics.h"
 #include "components/password_manager/core/browser/password_store/password_store_interface.h"
 #include "components/password_manager/core/browser/sharing/password_receiver_service.h"
 #include "components/password_manager/core/browser/sharing/password_sender_service.h"
@@ -777,10 +776,6 @@
   return true;
 }
 
-void ChromeSyncClient::OnLocalSyncTransportDataCleared() {
-  metrics::ClearDemographicsPrefs(profile_->GetPrefs());
-}
-
 bool ChromeSyncClient::IsPasswordSyncAllowed() {
 #if BUILDFLAG(IS_ANDROID)
   return profile_->GetPrefs()->GetInteger(
diff --git a/chrome/browser/sync/chrome_sync_client.h b/chrome/browser/sync/chrome_sync_client.h
index d88526d..dca5baee 100644
--- a/chrome/browser/sync/chrome_sync_client.h
+++ b/chrome/browser/sync/chrome_sync_client.h
@@ -60,7 +60,6 @@
   GetControllerDelegateForModelType(syncer::ModelType type) override;
   syncer::SyncApiComponentFactory* GetSyncApiComponentFactory() override;
   bool IsCustomPassphraseAllowed() override;
-  void OnLocalSyncTransportDataCleared() override;
   bool IsPasswordSyncAllowed() override;
   void SetPasswordSyncAllowedChangeCb(
       const base::RepeatingClosure& cb) override;
diff --git a/chrome/browser/touch_to_fill/password_manager/password_generation/android/touch_to_fill_password_generation_bridge_impl.cc b/chrome/browser/touch_to_fill/password_manager/password_generation/android/touch_to_fill_password_generation_bridge_impl.cc
index fda15b82..0de1514 100644
--- a/chrome/browser/touch_to_fill/password_manager/password_generation/android/touch_to_fill_password_generation_bridge_impl.cc
+++ b/chrome/browser/touch_to_fill/password_manager/password_generation/android/touch_to_fill_password_generation_bridge_impl.cc
@@ -14,10 +14,7 @@
 #include "ui/android/window_android.h"
 
 TouchToFillPasswordGenerationBridgeImpl::
-    TouchToFillPasswordGenerationBridgeImpl() {
-  DCHECK(base::FeatureList::IsEnabled(
-      password_manager::features::kPasswordGenerationBottomSheet));
-}
+    TouchToFillPasswordGenerationBridgeImpl() = default;
 
 TouchToFillPasswordGenerationBridgeImpl::
     ~TouchToFillPasswordGenerationBridgeImpl() = default;
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index e001257..eadd285d8 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -922,8 +922,6 @@
       "android/passwords/credential_leak_dialog_view_android.h",
       "android/passwords/manual_filling_view_android.cc",
       "android/passwords/manual_filling_view_android.h",
-      "android/passwords/password_generation_dialog_view_android.cc",
-      "android/passwords/password_generation_dialog_view_android.h",
       "android/passwords/password_generation_editing_popup_view_android.cc",
       "android/passwords/password_generation_editing_popup_view_android.h",
       "android/plus_addresses/plus_address_creation_controller_android.cc",
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditText.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditText.java
index 03a1a02..fa9cfc7 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditText.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditText.java
@@ -17,6 +17,7 @@
 import android.widget.EditText;
 
 import androidx.annotation.CallSuper;
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
@@ -199,7 +200,8 @@
      * @param userText user The text entered by the user.
      * @param inlineAutocompleteText The suggested autocompletion for the user's text.
      */
-    public void setAutocompleteText(CharSequence userText, CharSequence inlineAutocompleteText) {
+    public void setAutocompleteText(
+            @NonNull CharSequence userText, @Nullable CharSequence inlineAutocompleteText) {
         boolean emptyAutocomplete = TextUtils.isEmpty(inlineAutocompleteText);
         if (!emptyAutocomplete) mDisableTextScrollingFromAutocomplete = true;
         if (mModel != null) mModel.setAutocompleteText(userText, inlineAutocompleteText);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextModelBase.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextModelBase.java
index e6ac1bf6..09a3ede 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextModelBase.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextModelBase.java
@@ -11,6 +11,8 @@
 import android.widget.EditText;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 /** An abstraction of the text model to show, keep track of, and update autocomplete. */
@@ -190,7 +192,8 @@
      * @param userText user The text entered by the user.
      * @param inlineAutocompleteText The suggested autocompletion for the user's text.
      */
-    void setAutocompleteText(CharSequence userText, CharSequence inlineAutocompleteText);
+    void setAutocompleteText(
+            @NonNull CharSequence userText, @Nullable CharSequence inlineAutocompleteText);
 
     /**
      * Whether we want to be showing inline autocomplete results. We don't want to show them as the
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteState.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteState.java
index 9758b805..61dcb3f 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteState.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteState.java
@@ -6,14 +6,17 @@
 
 import android.text.TextUtils;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import java.util.Locale;
 
 /** A state to keep track of EditText and autocomplete. */
 class AutocompleteState {
-    private String mUserText;
-    private String mAutocompleteText;
+    @NonNull private String mUserText;
+    // TODO(gangwu) : make to to be Optional<>
+    @NonNull private String mAutocompleteText;
     private int mSelStart;
     private int mSelEnd;
 
@@ -21,13 +24,15 @@
         copyFrom(a);
     }
 
-    public AutocompleteState(String userText, String autocompleteText, int selStart, int selEnd) {
+    public AutocompleteState(
+            @NonNull String userText, @Nullable String autocompleteText, int selStart, int selEnd) {
         set(userText, autocompleteText, selStart, selEnd);
     }
 
-    public void set(String userText, String autocompleteText, int selStart, int selEnd) {
+    public void set(
+            @NonNull String userText, @Nullable String autocompleteText, int selStart, int selEnd) {
         mUserText = userText;
-        mAutocompleteText = autocompleteText;
+        mAutocompleteText = autocompleteText == null ? "" : autocompleteText;
         mSelStart = selStart;
         mSelEnd = selEnd;
     }
@@ -36,12 +41,14 @@
         set(a.mUserText, a.mAutocompleteText, a.mSelStart, a.mSelEnd);
     }
 
+    @NonNull
     public String getUserText() {
         return mUserText;
     }
 
+    @NonNull
     public String getAutocompleteText() {
-        return mAutocompleteText;
+        return mAutocompleteText != null ? mAutocompleteText : "";
     }
 
     public boolean hasAutocompleteText() {
@@ -51,8 +58,9 @@
     /**
      * @return The whole text including autocomplete text.
      */
+    @NonNull
     public String getText() {
-        return mUserText + mAutocompleteText;
+        return mUserText + getAutocompleteText();
     }
 
     public int getSelStart() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteStateUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteStateUnitTest.java
index 27c157c..b35bc39f 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteStateUnitTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteStateUnitTest.java
@@ -101,4 +101,12 @@
                 false,
                 "a");
     }
+
+    @Test
+    public void testNullAutocompleteText() {
+        AutocompleteState autocompleteState = new AutocompleteState("abc", null, 3, 3);
+        assertEquals("abc", autocompleteState.getUserText());
+        assertEquals("", autocompleteState.getAutocompleteText());
+        assertEquals("abc", autocompleteState.getText());
+    }
 }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SpannableAutocompleteEditTextModel.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SpannableAutocompleteEditTextModel.java
index 1abf9ad..00d0c78 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SpannableAutocompleteEditTextModel.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SpannableAutocompleteEditTextModel.java
@@ -21,6 +21,8 @@
 import android.view.inputmethod.InputConnectionWrapper;
 import android.view.inputmethod.InputContentInfo;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.Log;
@@ -43,7 +45,7 @@
     private static final Pattern NON_COMPOSITIONAL_TEXT_PATTERN =
             Pattern.compile(
                     "[\\p{script=latin}\\p{script=cyrillic}\\p{script=greek}\\p{script=hebrew}\\p{Punct}"
-                            + " 0-9]*");
+                        + " 0-9]*");
 
     private final AutocompleteEditTextModelBase.Delegate mDelegate;
 
@@ -365,16 +367,20 @@
     }
 
     @Override
-    public void setAutocompleteText(CharSequence userText, CharSequence inlineAutocompleteText) {
+    public void setAutocompleteText(
+            @NonNull CharSequence userText, @Nullable CharSequence inlineAutocompleteText) {
         // Note: this is invoked when the Autocomplete text is supplied by the Autocomplete
         // subsystem. These changes should be ignored for Autocomplete, specifically should not
         // be sent back to the Autocomplete subsystem to trigger suggestions fetch.
         setIgnoreTextChangeFromAutocomplete(true);
-        setAutocompleteTextInternal(userText.toString(), inlineAutocompleteText.toString());
+        setAutocompleteTextInternal(
+                userText.toString(),
+                inlineAutocompleteText != null ? inlineAutocompleteText.toString() : null);
         setIgnoreTextChangeFromAutocomplete(false);
     }
 
-    private void setAutocompleteTextInternal(String userText, String autocompleteText) {
+    private void setAutocompleteTextInternal(
+            @NonNull String userText, @Nullable String autocompleteText) {
         if (DEBUG) Log.i(TAG, "setAutocompleteText: %s[%s]", userText, autocompleteText);
         mPreviouslySetState.set(userText, autocompleteText, userText.length(), userText.length());
         // TODO(changwan): avoid any unnecessary removal and addition of autocomplete text when it
@@ -484,15 +490,19 @@
             int sel = state.getSelStart();
 
             if (mSpan == null) mSpan = new BackgroundColorSpan(mDelegate.getHighlightColor());
-            SpannableString spanString = new SpannableString(state.getAutocompleteText());
-            // The flag here helps make sure that span does not get spill to other part of the text.
-            spanString.setSpan(
-                    mSpan,
-                    0,
-                    state.getAutocompleteText().length(),
-                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
             Editable editable = mDelegate.getEditableText();
-            editable.append(spanString);
+
+            if (state.hasAutocompleteText()) {
+                SpannableString spanString = new SpannableString(state.getAutocompleteText());
+                // The flag here helps make sure that span does not get spill to other part of the
+                // text.
+                spanString.setSpan(
+                        mSpan,
+                        0,
+                        state.getAutocompleteText().length(),
+                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+                editable.append(spanString);
+            }
 
             // Keep the original selection before adding spannable string.
             Selection.setSelection(editable, sel, sel);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarProperties.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarProperties.java
index 92965f5..2e75343 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarProperties.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarProperties.java
@@ -87,7 +87,7 @@
                 @Nullable String autocompleteText,
                 @Nullable String additionalText) {
             this.userText = userText;
-            this.autocompleteText = autocompleteText != null ? autocompleteText : "";
+            this.autocompleteText = autocompleteText;
             this.additionalText = additionalText;
         }
 
diff --git a/chrome/browser/ui/android/passwords/password_generation_dialog_view_android.cc b/chrome/browser/ui/android/passwords/password_generation_dialog_view_android.cc
deleted file mode 100644
index 5cc7111..0000000
--- a/chrome/browser/ui/android/passwords/password_generation_dialog_view_android.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/android/passwords/password_generation_dialog_view_android.h"
-
-#include <string>
-
-#include "base/android/jni_android.h"
-#include "base/android/jni_string.h"
-#include "base/memory/weak_ptr.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/android/chrome_jni_headers/PasswordGenerationDialogBridge_jni.h"
-#include "chrome/browser/password_manager/android/password_generation_controller.h"
-#include "chrome/browser/password_manager/android/password_generation_controller_impl.h"
-#include "chrome/browser/password_manager/android/password_infobar_utils.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/grit/branded_strings.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/password_manager/content/browser/content_password_manager_driver.h"
-#include "components/password_manager/core/browser/password_manager_metrics_util.h"
-#include "components/signin/public/identity_manager/account_info.h"
-#include "ui/android/window_android.h"
-#include "ui/base/l10n/l10n_util.h"
-
-using password_manager::metrics_util::GenerationDialogChoice;
-
-PasswordGenerationDialogViewAndroid::PasswordGenerationDialogViewAndroid(
-    PasswordGenerationController* controller)
-    : controller_(controller) {
-  ui::WindowAndroid* window_android = controller_->top_level_native_window();
-
-  DCHECK(window_android);
-  java_object_.Reset(Java_PasswordGenerationDialogBridge_create(
-      base::android::AttachCurrentThread(), window_android->GetJavaObject(),
-      reinterpret_cast<intptr_t>(this)));
-}
-
-PasswordGenerationDialogViewAndroid::~PasswordGenerationDialogViewAndroid() {
-  DCHECK(!java_object_.is_null());
-  Java_PasswordGenerationDialogBridge_destroy(
-      base::android::AttachCurrentThread(), java_object_);
-}
-
-void PasswordGenerationDialogViewAndroid::Show(
-    std::u16string& password,
-    base::WeakPtr<password_manager::ContentPasswordManagerDriver>
-        target_frame_driver,
-    autofill::password_generation::PasswordGenerationType type) {
-  generation_type_ = type;
-  target_frame_driver_ = std::move(target_frame_driver);
-  JNIEnv* env = base::android::AttachCurrentThread();
-
-  Profile* profile = Profile::FromBrowserContext(
-      controller_->web_contents()->GetBrowserContext());
-  std::optional<AccountInfo> account_info =
-      password_manager::GetAccountInfoForPasswordMessages(profile);
-
-  std::u16string explanation_text;
-  if (account_info.has_value()) {
-    explanation_text = l10n_util::GetStringFUTF16(
-        IDS_PASSWORD_GENERATION_DIALOG_DESCRIPTION_BRANDED,
-        base::UTF8ToUTF16(account_info.value().email));
-  } else {
-    explanation_text =
-        l10n_util::GetStringUTF16(IDS_PASSWORD_GENERATION_PROMPT);
-  }
-
-  Java_PasswordGenerationDialogBridge_showDialog(env, java_object_, password,
-                                                 explanation_text);
-}
-
-void PasswordGenerationDialogViewAndroid::PasswordAccepted(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
-    const std::u16string& password) {
-  controller_->GeneratedPasswordAccepted(
-      password, std::move(target_frame_driver_), generation_type_);
-}
-
-void PasswordGenerationDialogViewAndroid::PasswordRejected(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
-  controller_->GeneratedPasswordRejected(generation_type_);
-}
-
-// static
-std::unique_ptr<PasswordGenerationDialogViewInterface>
-PasswordGenerationDialogViewInterface::Create(
-    PasswordGenerationController* controller) {
-  return std::make_unique<PasswordGenerationDialogViewAndroid>(controller);
-}
diff --git a/chrome/browser/ui/android/passwords/password_generation_dialog_view_android.h b/chrome/browser/ui/android/passwords/password_generation_dialog_view_android.h
deleted file mode 100644
index ab9706e..0000000
--- a/chrome/browser/ui/android/passwords/password_generation_dialog_view_android.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_ANDROID_PASSWORDS_PASSWORD_GENERATION_DIALOG_VIEW_ANDROID_H_
-#define CHROME_BROWSER_UI_ANDROID_PASSWORDS_PASSWORD_GENERATION_DIALOG_VIEW_ANDROID_H_
-
-#include <jni.h>
-
-#include <string>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/memory/raw_ptr.h"
-#include "chrome/browser/password_manager/android/password_generation_dialog_view_interface.h"
-
-class PasswordGenerationController;
-
-// Modal dialog displaying a generated password with options to accept or
-// reject it. Communicates events to its Java counterpart and passes responses
-// back to the |PasswordGenerationController|.
-class PasswordGenerationDialogViewAndroid
-    : public PasswordGenerationDialogViewInterface {
- public:
-  // Builds the UI for the |controller|
-  explicit PasswordGenerationDialogViewAndroid(
-      PasswordGenerationController* controller);
-
-  PasswordGenerationDialogViewAndroid(
-      const PasswordGenerationDialogViewAndroid&) = delete;
-  PasswordGenerationDialogViewAndroid& operator=(
-      const PasswordGenerationDialogViewAndroid&) = delete;
-
-  ~PasswordGenerationDialogViewAndroid() override;
-
-  // Called to show the dialog. |password| is the generated password.
-  void Show(
-      std::u16string& password,
-      base::WeakPtr<password_manager::ContentPasswordManagerDriver>
-          target_frame_driver,
-      autofill::password_generation::PasswordGenerationType type) override;
-
-  // Called from Java via JNI.
-  void PasswordAccepted(JNIEnv* env,
-                        const base::android::JavaParamRef<jobject>& obj,
-                        const std::u16string& password);
-
-  // Called from Java via JNI.
-  void PasswordRejected(JNIEnv* env,
-                        const base::android::JavaParamRef<jobject>& obj);
-
- private:
-  // The controller provides data for this view and owns it.
-  raw_ptr<PasswordGenerationController> controller_;
-
-  // The corresponding java object.
-  base::android::ScopedJavaGlobalRef<jobject> java_object_;
-
-  // The driver corresponding to the frame for which the generation request was
-  // made. Used to ensure that the accepted password message is sent back to the
-  // same frame.
-  base::WeakPtr<password_manager::ContentPasswordManagerDriver>
-      target_frame_driver_;
-
-  // Whether the dialog was shown for manual generation or not. Used for
-  // metrics.
-  autofill::password_generation::PasswordGenerationType generation_type_;
-};
-
-#endif  // CHROME_BROWSER_UI_ANDROID_PASSWORDS_PASSWORD_GENERATION_DIALOG_VIEW_ANDROID_H_
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 8465cb9..dcb3ae5 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2635,15 +2635,9 @@
       </message>
 
       <!-- Password manager dialogs -->
-      <message name="IDS_PASSWORD_GENERATION_DIALOG_TITLE" desc="Text shown in a modal dialog that displays a generated password. This dialog is triggered by the user requesting to generate a password. Unified Password Manager version.">
-        Use strong password?
-      </message>
       <message name="IDS_PASSWORD_GENERATION_DIALOG_CANCEL_BUTTON" desc="Text for the cancel button belonging to the modal dialog that displays a generated password. Can be used by the user to cancel the password generation flow.">
         Cancel
       </message>
-      <message name="IDS_PASSWORD_GENERATION_DIALOG_USE_PASSWORD_BUTTON" desc="Text for a button belonging to the modal dialog that displayes a generated password. Can be used by the user to accept the generated password.">
-        Use password
-      </message>
       <message name="IDS_PASSWORD_FILLING_REAUTH_PROMPT_TITLE" desc="The title of the authentication dialog displayed before the password manager fills a saved password into a website.">
         Verify it’s you
       </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_GENERATION_DIALOG_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_GENERATION_DIALOG_TITLE.png.sha1
deleted file mode 100644
index fea1900..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_GENERATION_DIALOG_TITLE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-4f51fafad640e9cfc353aed9a53c7f74e82644f0
\ No newline at end of file
diff --git a/chrome/browser/ui/autofill/autofill_keyboard_accessory_controller_impl.cc b/chrome/browser/ui/autofill/autofill_keyboard_accessory_controller_impl.cc
index 9972066d..3c00e3b 100644
--- a/chrome/browser/ui/autofill/autofill_keyboard_accessory_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_keyboard_accessory_controller_impl.cc
@@ -502,12 +502,8 @@
 }
 
 bool AutofillKeyboardAccessoryControllerImpl::HasSuggestions() const {
-  if (suggestions_.empty()) {
-    return false;
-  }
-  SuggestionType type = suggestions_[0].type;
-  return base::Contains(kItemsTriggeringFieldFilling, type) ||
-         type == SuggestionType::kScanCreditCard;
+  return !suggestions_.empty() &&
+         IsStandaloneSuggestionType(suggestions_[0].type);
 }
 
 // AutofillKeyboardAccessoryController implementation:
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
index b53245d..6990aae 100644
--- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
@@ -525,12 +525,8 @@
 }
 
 bool AutofillPopupControllerImpl::HasSuggestions() const {
-  if (GetSuggestions().empty()) {
-    return false;
-  }
-  SuggestionType type = GetSuggestions()[0].type;
-  return base::Contains(kItemsTriggeringFieldFilling, type) ||
-         type == SuggestionType::kScanCreditCard;
+  return !GetSuggestions().empty() &&
+         IsStandaloneSuggestionType(GetSuggestions()[0].type);
 }
 
 void AutofillPopupControllerImpl::SetSuggestions(
diff --git a/chrome/browser/ui/autofill/autofill_suggestion_controller_utils.cc b/chrome/browser/ui/autofill/autofill_suggestion_controller_utils.cc
index 4335ed3..88fbdb2e6 100644
--- a/chrome/browser/ui/autofill/autofill_suggestion_controller_utils.cc
+++ b/chrome/browser/ui/autofill/autofill_suggestion_controller_utils.cc
@@ -100,6 +100,11 @@
              : IsFooterSuggestionType(type);
 }
 
+bool IsStandaloneSuggestionType(SuggestionType type) {
+  return !IsFooterSuggestionType(type) ||
+         (type == SuggestionType::kScanCreditCard);
+}
+
 content::RenderFrameHost* GetRenderFrameHost(
     AutofillSuggestionDelegate& delegate) {
   return absl::visit(
diff --git a/chrome/browser/ui/autofill/autofill_suggestion_controller_utils.h b/chrome/browser/ui/autofill/autofill_suggestion_controller_utils.h
index f85f49d..51ed79bc 100644
--- a/chrome/browser/ui/autofill/autofill_suggestion_controller_utils.h
+++ b/chrome/browser/ui/autofill/autofill_suggestion_controller_utils.h
@@ -36,6 +36,11 @@
 bool IsFooterItem(const std::vector<Suggestion>& suggestions,
                   size_t line_number);
 
+// Returns `true` if the popup should remain open with a suggestion of `type`
+// as the first suggestion (e.g. after deleting a suggestion). This is true for
+// all non-footer suggestions and false for most footer suggestions.
+bool IsStandaloneSuggestionType(SuggestionType type);
+
 // Returns the RenderFrameHost` corresponding to an
 // `AutofillSuggestionDelegate`.
 content::RenderFrameHost* GetRenderFrameHost(
diff --git a/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.cc b/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.cc
index 1ed711b..81c378b 100644
--- a/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.cc
+++ b/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.cc
@@ -7,6 +7,7 @@
 #include "base/check_deref.h"
 #include "base/functional/callback_helpers.h"
 #include "base/notreached.h"
+#include "base/time/time.h"
 #include "base/types/expected.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/autofill/payments/view_factory.h"
@@ -125,6 +126,9 @@
 
   if (base::WeakPtr<content::NavigationHandle> navigation_handle =
           Navigate(&params)) {
+    if (flow_type_ == FlowType::kVcn3ds) {
+      vcn_3ds_popup_shown_timestamp_ = base::TimeTicks::Now();
+    }
     content::WebContentsObserver::Observe(navigation_handle->GetWebContents());
   } else {
     autofill_metrics::LogVcn3dsFlowEvent(
@@ -155,13 +159,18 @@
 }
 
 void DesktopPaymentsWindowManager::OnWebContentsDestroyedForVcn3ds() {
+  CHECK(vcn_3ds_popup_shown_timestamp_.has_value());
   base::expected<RedirectCompletionProof,
                  Vcn3dsAuthenticationPopupNonSuccessResult>
       result = ParseUrlForVcn3ds(web_contents()->GetVisibleURL());
+
   // If the result implies that the authentication inside of the pop-up was
   // successful, continue the flow without resetting.
   if (result.has_value()) {
     CHECK(!result.value()->empty());
+    autofill_metrics::LogVcn3dsAuthLatency(
+        base::TimeTicks::Now() - vcn_3ds_popup_shown_timestamp_.value(),
+        /*success=*/true);
     client_->GetPaymentsAutofillClient()->ShowAutofillProgressDialog(
         AutofillProgressDialogType::kVirtualCardUnmaskProgressDialog,
         base::BindOnce(&DesktopPaymentsWindowManager::
@@ -186,6 +195,9 @@
         Vcn3dsFlowEvent::kAuthenticationInsidePopupFailed,
         /*user_consent_already_given=*/vcn_3ds_context_
             ->user_consent_already_given);
+    autofill_metrics::LogVcn3dsAuthLatency(
+        base::TimeTicks::Now() - vcn_3ds_popup_shown_timestamp_.value(),
+        /*success=*/false);
     client_->GetPaymentsAutofillClient()->ShowAutofillErrorDialog(
         AutofillErrorDialogContext::WithVirtualCardPermanentOrTemporaryError(
             /*is_permanent_error=*/true));
@@ -300,6 +312,7 @@
 void DesktopPaymentsWindowManager::Reset() {
   vcn_3ds_context_.reset();
   flow_type_ = FlowType::kNoFlow;
+  vcn_3ds_popup_shown_timestamp_.reset();
 }
 
 }  // namespace autofill::payments
diff --git a/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.h b/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.h
index c22f5591..9e7c28a 100644
--- a/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.h
+++ b/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.h
@@ -121,6 +121,10 @@
   // Only present if `flow_type_` is `kVcn3ds`.
   std::optional<Vcn3dsContext> vcn_3ds_context_;
 
+  // The timestamp for when the VCN 3DS pop-up was shown to the user. Used for
+  // logging purposes.
+  std::optional<base::TimeTicks> vcn_3ds_popup_shown_timestamp_;
+
   // The type of flow that is currently ongoing. Set when a flow is initiated.
   FlowType flow_type_ = FlowType::kNoFlow;
 
diff --git a/chrome/browser/ui/autofill/payments/desktop_payments_window_manager_interactive_uitest.cc b/chrome/browser/ui/autofill/payments/desktop_payments_window_manager_interactive_uitest.cc
index eda3063..783e888 100644
--- a/chrome/browser/ui/autofill/payments/desktop_payments_window_manager_interactive_uitest.cc
+++ b/chrome/browser/ui/autofill/payments/desktop_payments_window_manager_interactive_uitest.cc
@@ -62,6 +62,10 @@
     "Autofill.Vcn3ds.FlowEvents.ConsentAlreadyGiven";
 constexpr std::string_view kVcn3dsFlowEventsConsentNotGivenYetHistogramName =
     "Autofill.Vcn3ds.FlowEvents.ConsentNotGivenYet";
+constexpr std::string_view kVcn3dsSuccessLatencyHistogramName =
+    "Autofill.Vcn3ds.Latency.Success";
+constexpr std::string_view kVcn3dsFailureLatencyHistogramName =
+    "Autofill.Vcn3ds.Latency.Failure";
 
 class DesktopPaymentsWindowManagerInteractiveUiTest : public UiBrowserTest {
  public:
@@ -313,6 +317,53 @@
       autofill_metrics::Vcn3dsFlowEvent::kFlowSucceeded, 1);
 }
 
+// Tests that the VCN 3DS flow succeeded latency histogram bucket is logged to
+// when a successful flow is completed for VCN 3DS.
+IN_PROC_BROWSER_TEST_F(
+    DesktopPaymentsWindowManagerInteractiveUiTest,
+    InvokeUi_Vcn3ds_QueryParamsPresent_SuccessLatencyHistogramBucketLogs) {
+  ShowUi("Vcn3ds_ConsentAlreadyGiven");
+  EXPECT_TRUE(VerifyUi());
+
+  // Navigate to a page where there are shouldProceed and token query params.
+  GetPopupWebContents()->OpenURL(
+      content::OpenURLParams(
+          GURL("https://site.example/?shouldProceed=true&token=sometesttoken"),
+          content::Referrer(), WindowOpenDisposition::CURRENT_TAB,
+          ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL,
+          /*is_renderer_initiated=*/false),
+      /*navigation_handle_callback=*/{});
+
+  base::RunLoop().RunUntilIdle();
+
+  histogram_tester_.ExpectTotalCount(kVcn3dsSuccessLatencyHistogramName, 1);
+  histogram_tester_.ExpectTotalCount(kVcn3dsFailureLatencyHistogramName, 0);
+}
+
+// Tests that the VCN 3DS flow failure latency histogram bucket is logged to
+// when a failed flow is completed for VCN 3DS.
+IN_PROC_BROWSER_TEST_F(
+    DesktopPaymentsWindowManagerInteractiveUiTest,
+    InvokeUi_Vcn3ds_QueryParamsPresent_FailureLatencyHistogramBucketLogs) {
+  ShowUi("Vcn3ds_ConsentAlreadyGiven");
+  EXPECT_TRUE(VerifyUi());
+
+  // Navigate to a page where there is a shouldProceed query param that denotes
+  // failure.
+  GetPopupWebContents()->OpenURL(
+      content::OpenURLParams(GURL("https://site.example/?shouldProceed=false"),
+                             content::Referrer(),
+                             WindowOpenDisposition::CURRENT_TAB,
+                             ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL,
+                             /*is_renderer_initiated=*/false),
+      /*navigation_handle_callback=*/{});
+
+  base::RunLoop().RunUntilIdle();
+
+  histogram_tester_.ExpectTotalCount(kVcn3dsSuccessLatencyHistogramName, 0);
+  histogram_tester_.ExpectTotalCount(kVcn3dsFailureLatencyHistogramName, 1);
+}
+
 // Test that the VCN 3DS pop-up is shown correctly, and on close an
 // UnmaskCardRequest is triggered with the proper fields set if the right query
 // params are present. Then mock an UnmaskCardRequest failure, and check that
diff --git a/chrome/browser/ui/lens/lens_overlay_controller.cc b/chrome/browser/ui/lens/lens_overlay_controller.cc
index 9ddb2232..252aa3ac 100644
--- a/chrome/browser/ui/lens/lens_overlay_controller.cc
+++ b/chrome/browser/ui/lens/lens_overlay_controller.cc
@@ -26,8 +26,6 @@
 #include "chrome/browser/ui/side_panel/side_panel_ui.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/side_panel/side_panel.h"
-#include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h"
-#include "chrome/browser/ui/views/side_panel/side_panel_util.h"
 #include "chrome/browser/ui/webui/util/image_util.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
@@ -186,7 +184,6 @@
   glued_webviews_.clear();
   tab_->GetContents()->RemoveUserData(
       LensOverlayControllerTabLookup::UserDataKey());
-
   state_ = State::kOff;
 }
 
@@ -257,6 +254,18 @@
     return;
   }
 
+  // Begin the process of grabbing a screenshot.
+  content::RenderWidgetHostView* view = tab_->GetContents()
+                                            ->GetPrimaryMainFrame()
+                                            ->GetRenderViewHost()
+                                            ->GetWidget()
+                                            ->GetView();
+
+  // During initialization and shutdown a capture may not be possible.
+  if (!view || !view->IsSurfaceAvailableForCopy()) {
+    return;
+  }
+
   // Request user permission before grabbing a screenshot.
   Browser* tab_browser = chrome::FindBrowserWithTab(tab_->GetContents());
   CHECK(tab_browser);
@@ -300,23 +309,17 @@
                           weak_factory_.GetWeakPtr()),
       variations_client_, identity_manager_);
 
-  side_panel_coordinator_ =
-      SidePanelUtil::GetSidePanelCoordinatorForBrowser(tab_browser);
-  CHECK(side_panel_coordinator_);
-
-  // Setup observer to be notified of side panel opens and closes.
-  side_panel_state_observer_.Observe(side_panel_coordinator_);
-
-  if (side_panel_coordinator_->IsSidePanelShowing()) {
-    // Close the currently opened side panel and postpone taking the screenshot
-    // until OnSidePanelDidClose
-    state_ = State::kClosingOpenedSidePanel;
-    side_panel_coordinator_->Close();
-  } else {
-    CaptureScreenshot();
-  }
-
+  state_ = State::kScreenshot;
   scoped_tab_modal_ui_ = tab_->ShowModalUI();
+
+  view->CopyFromSurface(
+      /*src_rect=*/gfx::Rect(), /*output_size=*/gfx::Size(),
+      base::BindPostTask(
+          base::SequencedTaskRunner::GetCurrentDefault(),
+          base::BindOnce(&LensOverlayController::DidCaptureScreenshot,
+                         weak_factory_.GetWeakPtr(),
+                         ++screenshot_attempt_id_)));
+
   base::UmaHistogramEnumeration("Lens.Overlay.Invoked", invocation_source);
 }
 
@@ -324,31 +327,15 @@
   if (state_ == State::kOff || state_ == State::kClosing) {
     return;
   }
+  state_ = State::kClosing;
 
   // If the tab is in the background, the async processes needed if the callback
   // is coming from the WebUI don't apply and we can call CloseUI directly.
   if (!tab_->IsInForeground()) {
-    state_ = State::kClosing;
     CloseUIPart2(dismissal_source);
     return;
   }
 
-  if (state_ == State::kOverlayAndResults) {
-    if (side_panel_coordinator_->GetCurrentEntryId() ==
-        SidePanelEntry::Id::kLensOverlayResults) {
-      // If a close was triggered while our side panel is showing, instead of
-      // just immediately closing the overlay, we close side panel to show a
-      // smooth closing animation. Once the side panel deregisters, it will
-      // re-call our close method in OnSidePanelDidClose() which will finish the
-      // closing process.
-      state_ = State::kClosingSidePanel;
-      last_dismissal_source_ = dismissal_source;
-      side_panel_coordinator_->Close();
-      return;
-    }
-  }
-  state_ = State::kClosing;
-
   // To avoid flickering, we need to remove the background blur and wait for a
   // paint before closing the rest of the overlay.
   RemoveBackgroundBlur();
@@ -483,8 +470,7 @@
 
 bool LensOverlayController::IsOverlayShowing() {
   return state_ == State::kStartingWebUI || state_ == State::kOverlay ||
-         state_ == State::kOverlayAndResults ||
-         state_ == State::kClosingSidePanel;
+         state_ == State::kOverlayAndResults;
 }
 
 void LensOverlayController::LoadURLInResultsFrame(const GURL& url) {
@@ -586,12 +572,6 @@
 }
 
 void LensOverlayController::OnSidePanelEntryDeregistered() {
-  if (state_ == State::kClosingSidePanel) {
-    CHECK(last_dismissal_source_.has_value());
-    CloseUIAsync(*last_dismissal_source_);
-    last_dismissal_source_.reset();
-    return;
-  }
   CloseUIAsync(DismissalSource::kSidePanelCloseButton);
 }
 
@@ -678,30 +658,6 @@
   raw_ptr<LensOverlayController> lens_overlay_controller_;
 };
 
-void LensOverlayController::CaptureScreenshot() {
-  // Begin the process of grabbing a screenshot.
-  content::RenderWidgetHostView* view = tab_->GetContents()
-                                            ->GetPrimaryMainFrame()
-                                            ->GetRenderViewHost()
-                                            ->GetWidget()
-                                            ->GetView();
-
-  // During initialization and shutdown a capture may not be possible.
-  if (!view || !view->IsSurfaceAvailableForCopy()) {
-    CloseUIAsync(DismissalSource::kErrorScreenshotCreationFailed);
-  }
-
-  state_ = State::kScreenshot;
-  // Side panel is now full closed, take screenshot and open overlay.
-  view->CopyFromSurface(
-      /*src_rect=*/gfx::Rect(), /*output_size=*/gfx::Size(),
-      base::BindPostTask(
-          base::SequencedTaskRunner::GetCurrentDefault(),
-          base::BindOnce(&LensOverlayController::DidCaptureScreenshot,
-                         weak_factory_.GetWeakPtr(),
-                         ++screenshot_attempt_id_)));
-}
-
 void LensOverlayController::DidCaptureScreenshot(int attempt_id,
                                                  const SkBitmap& bitmap) {
   // While capturing a screenshot the overlay was cancelled. Do nothing.
@@ -868,9 +824,6 @@
   permission_bubble_controller_.reset();
   results_side_panel_coordinator_.reset();
 
-  side_panel_state_observer_.Reset();
-  side_panel_coordinator_ = nullptr;
-
   // Widget destruction can be asynchronous. We want to synchronously release
   // resources, so we clear the contents view immediately.
   overlay_web_view_ = nullptr;
@@ -1060,32 +1013,6 @@
   }
 }
 
-void LensOverlayController::OnSidePanelDidOpen() {
-  // If a side panel opens that is not ours, we must close the overlay.
-  if (side_panel_coordinator_->GetCurrentEntryId() !=
-      SidePanelEntry::Id::kLensOverlayResults) {
-    CloseUIAsync(DismissalSource::kUnexpectedSidePanelOpen);
-  }
-}
-
-void LensOverlayController::OnSidePanelCloseInterrupted() {
-  // If we were waiting for the side panel to close, but another side panel
-  // opened in the process, we need to close the overlay to not show next to the
-  // unwanted side panel.
-  if (state_ == State::kClosingOpenedSidePanel) {
-    CloseUIAsync(DismissalSource::kUnexpectedSidePanelOpen);
-  }
-}
-
-void LensOverlayController::OnSidePanelDidClose() {
-  if (state_ == State::kClosingOpenedSidePanel) {
-    // This path is invoked after the user invokes the overlay, but we needed to
-    // close the side panel before taking a screenshot. The Side panel is now
-    // closed so we can now take the screenshot of the page.
-    CaptureScreenshot();
-  }
-}
-
 void LensOverlayController::TabForegrounded(tabs::TabInterface* tab) {
   // If the overlay was backgrounded, reshow the overlay widget.
   if (state_ == State::kBackground) {
diff --git a/chrome/browser/ui/lens/lens_overlay_controller.h b/chrome/browser/ui/lens/lens_overlay_controller.h
index b297255..f623d165 100644
--- a/chrome/browser/ui/lens/lens_overlay_controller.h
+++ b/chrome/browser/ui/lens/lens_overlay_controller.h
@@ -12,8 +12,6 @@
 #include "chrome/browser/lens/core/mojom/text.mojom.h"
 #include "chrome/browser/ui/lens/lens_overlay_query_controller.h"
 #include "chrome/browser/ui/tabs/public/tab_interface.h"
-#include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h"
-#include "chrome/browser/ui/views/side_panel/side_panel_view_state_observer.h"
 #include "chrome/browser/ui/webui/searchbox/lens_searchbox_client.h"
 #include "chrome/browser/ui/webui/searchbox/realbox_handler.h"
 #include "components/lens/proto/server/lens_overlay_response.pb.h"
@@ -66,8 +64,7 @@
 class LensOverlayController : public LensSearchboxClient,
                               public lens::mojom::LensPageHandler,
                               public lens::mojom::LensSidePanelPageHandler,
-                              public content::WebContentsDelegate,
-                              public SidePanelViewStateObserver {
+                              public content::WebContentsDelegate {
  public:
   LensOverlayController(tabs::TabInterface* tab,
                         variations::VariationsClient* variations_client,
@@ -185,10 +182,7 @@
     // User pressed the escape key.
     kEscapeKeyPress = 9,
 
-    // Another side panel opened forcing our overlay to close.
-    kUnexpectedSidePanelOpen = 10,
-
-    kMaxValue = kUnexpectedSidePanelOpen
+    kMaxValue = kEscapeKeyPress
   };
   // LINT.ThenChange(//tools/metrics/histograms/metadata/others/enums.xml:LensOverlayDismissalSource)
 
@@ -246,10 +240,6 @@
     // this state will apply to all tabs.
     kOff,
 
-    // In the process of closing the side panel that was open when the overlay
-    // was invoked so we can make a full page screenshot
-    kClosingOpenedSidePanel,
-
     // In the process of taking a screenshot to transition to kOverlay.
     kScreenshot,
 
@@ -279,9 +269,6 @@
     // TODO(b/335516480): Implement suspended state.
     kSuspended,
 
-    // In the process of closing the side panel before closing the overlay.
-    kClosingSidePanel,
-
     // Will be kOff soon.
     kClosing,
   };
@@ -293,8 +280,8 @@
     return initialization_data_->current_screenshot_;
   }
 
-  // Returns the results side panel coordinator
-  lens::LensOverlaySidePanelCoordinator* results_side_panel_coordinator() {
+  // Returns the side panel coordinator
+  lens::LensOverlaySidePanelCoordinator* side_panel_coordinator() {
     return results_side_panel_coordinator_.get();
   }
 
@@ -466,9 +453,6 @@
 
   class UnderlyingWebContentsObserver;
 
-  // Takes a screenshot of the current viewport.
-  void CaptureScreenshot();
-
   // Called once a screenshot has been captured. This should trigger transition
   // to kOverlay. As this process is asynchronous, there are edge cases that can
   // result in multiple in-flight screenshot attempts. We record the
@@ -533,11 +517,6 @@
                             bool is_zero_prefix_suggestion) override;
   void OnPageBound() override;
 
-  // SidePanelViewStateObserver:
-  void OnSidePanelDidOpen() override;
-  void OnSidePanelCloseInterrupted() override;
-  void OnSidePanelDidClose() override;
-
   // Called when the associated tab enters the foreground.
   void TabForegrounded(tabs::TabInterface* tab);
 
@@ -643,11 +622,6 @@
   // Pending region to search after the overlay loads.
   lens::mojom::CenterRotatedBoxPtr pending_region_;
 
-  // If the side panel needed to be closed before dismissing the overlay, this
-  // stores the original dismissal_source so it is properly recorded when the
-  // side panel is done closing and the callback is invoked.
-  std::optional<DismissalSource> last_dismissal_source_;
-
   // Thumbnail URI referencing the data defined by the user image selection on
   // the overlay. If the user hasn't made any selection or has made a text
   // selection this will contain an empty string. Returned by GetThumbnail().
@@ -670,14 +644,6 @@
   std::unique_ptr<lens::LensOverlaySidePanelCoordinator>
       results_side_panel_coordinator_;
 
-  // General side panel coordinator responsible for all side panel interactions.
-  // Separate from the results_side_panel_coordinator because this controls
-  // interactions to other side panels as well, not just our results. The
-  // side_panel_coordinator leaves with the browser view, so it should outlive
-  // this class. Therefore, if the controller is not in the kOff state, this can
-  // be assumed to be non-null.
-  raw_ptr<SidePanelCoordinator> side_panel_coordinator_ = nullptr;
-
   // Searchbox handler for passing in image and text selections. The handler is
   // null if the WebUI containing the searchbox has not been initialized yet,
   // like in the case of side panel opening. In addition, the handler may be
@@ -718,9 +684,6 @@
   // Class for handling key events from the renderer that were not handled.
   views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
 
-  base::ScopedObservation<SidePanelCoordinator, SidePanelViewStateObserver>
-      side_panel_state_observer_{this};
-
   // Must be the last member.
   base::WeakPtrFactory<LensOverlayController> weak_factory_{this};
 };
diff --git a/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc b/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
index 7e41252..7ede762 100644
--- a/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
+++ b/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
@@ -29,8 +29,6 @@
 #include "chrome/browser/ui/tabs/tab_features.h"
 #include "chrome/browser/ui/tabs/tab_model.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/browser/ui/views/side_panel/side_panel.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_util.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -706,7 +704,7 @@
   EXPECT_FALSE(fake_controller->fake_overlay_page_.did_notify_results_opened_);
 
   // Now show the side panel.
-  controller->results_side_panel_coordinator()->RegisterEntryAndShow();
+  controller->side_panel_coordinator()->RegisterEntryAndShow();
 
   // Prevent flakiness by flushing the tasks.
   fake_controller->FlushForTesting();
@@ -769,7 +767,7 @@
       [&]() { return controller->state() == State::kOverlay; }));
 
   // Now show the side panel.
-  controller->results_side_panel_coordinator()->RegisterEntryAndShow();
+  controller->side_panel_coordinator()->RegisterEntryAndShow();
 
   // Ensure the side panel is showing.
   auto* coordinator =
@@ -1057,7 +1055,7 @@
 
   // Open a side panel to test that the side panel persists between tab
   // switches.
-  controller->results_side_panel_coordinator()->RegisterEntryAndShow();
+  controller->side_panel_coordinator()->RegisterEntryAndShow();
   auto* coordinator =
       SidePanelUtil::GetSidePanelCoordinatorForBrowser(browser());
   EXPECT_TRUE(coordinator->IsSidePanelShowing());
@@ -1781,178 +1779,4 @@
                                     /*expected_count=*/7);
 }
 
-IN_PROC_BROWSER_TEST_F(LensOverlayControllerBrowserTest,
-                       OverlayClosesSidePanelBeforeOpening) {
-  WaitForPaint();
-
-  // State should start in off.
-  auto* controller = browser()
-                         ->tab_strip_model()
-                         ->GetActiveTab()
-                         ->tab_features()
-                         ->lens_overlay_controller();
-  ASSERT_EQ(controller->state(), State::kOff);
-
-  // Open the side panel
-  auto* side_panel_coordinator =
-      SidePanelUtil::GetSidePanelCoordinatorForBrowser(browser());
-  side_panel_coordinator->Show(SidePanelEntry::Id::kBookmarks);
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return side_panel_coordinator->IsSidePanelShowing(); }));
-
-  // Showing UI should eventually result in overlay state. When the overlay is
-  // bound, it should start the query flow which returns a response for the
-  // interaction data callback.
-  controller->ShowUI(InvocationSource::kAppMenu);
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return controller->state() == State::kOverlay; }));
-
-  // Side panel should now be closed.
-  EXPECT_FALSE(side_panel_coordinator->IsSidePanelShowing());
-}
-
-IN_PROC_BROWSER_TEST_F(LensOverlayControllerBrowserTest,
-                       OverlayClosesIfSidePanelIsOpened) {
-  WaitForPaint();
-
-  // State should start in off.
-  auto* controller = browser()
-                         ->tab_strip_model()
-                         ->GetActiveTab()
-                         ->tab_features()
-                         ->lens_overlay_controller();
-  ASSERT_EQ(controller->state(), State::kOff);
-
-  // Showing UI should eventually result in overlay state. When the overlay is
-  // bound, it should start the query flow which returns a response for the
-  // interaction data callback.
-  controller->ShowUI(InvocationSource::kAppMenu);
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return controller->state() == State::kOverlay; }));
-
-  // Open the side panel
-  auto* side_panel_coordinator =
-      SidePanelUtil::GetSidePanelCoordinatorForBrowser(browser());
-  side_panel_coordinator->Show(SidePanelEntry::Id::kBookmarks);
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return side_panel_coordinator->IsSidePanelShowing(); }));
-
-  // Overlay should close.
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return controller->state() == State::kOff; }));
-}
-
-IN_PROC_BROWSER_TEST_F(LensOverlayControllerBrowserTest,
-                       OverlayClosesIfNewSidePanelEntryAppears) {
-  WaitForPaint();
-
-  // State should start in off.
-  auto* controller = browser()
-                         ->tab_strip_model()
-                         ->GetActiveTab()
-                         ->tab_features()
-                         ->lens_overlay_controller();
-  ASSERT_EQ(controller->state(), State::kOff);
-
-  // Showing UI should eventually result in overlay state. When the overlay is
-  // bound, it should start the query flow which returns a response for the
-  // interaction data callback.
-  controller->ShowUI(InvocationSource::kAppMenu);
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return controller->state() == State::kOverlay; }));
-
-  // Open our results panel
-  controller->IssueTextSelectionRequestForTesting("test query",
-                                                  /*selection_start_index=*/0,
-                                                  /*selection_end_index=*/0);
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return controller->state() == State::kOverlayAndResults; }));
-
-  // Open a different side panel
-  auto* side_panel_coordinator =
-      SidePanelUtil::GetSidePanelCoordinatorForBrowser(browser());
-
-  // Verify the side panel is open
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return side_panel_coordinator->IsSidePanelShowing(); }));
-
-  side_panel_coordinator->Show(SidePanelEntry::Id::kBookmarks);
-
-  // Overlay should close.
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return controller->state() == State::kOff; }));
-}
-
-IN_PROC_BROWSER_TEST_F(LensOverlayControllerBrowserTest,
-                       OverlaySidePanelEdgeCaseInteractions) {
-  WaitForPaint();
-
-  // State should start in off.
-  auto* controller = browser()
-                         ->tab_strip_model()
-                         ->GetActiveTab()
-                         ->tab_features()
-                         ->lens_overlay_controller();
-  ASSERT_EQ(controller->state(), State::kOff);
-
-  // First, test the flow if the user has a side panel open, we request to close
-  // it, and then a new side panel opens before the close is finished.
-  // Open the side panel
-  auto* side_panel_coordinator =
-      SidePanelUtil::GetSidePanelCoordinatorForBrowser(browser());
-  side_panel_coordinator->Show(SidePanelEntry::Id::kBookmarks);
-  ASSERT_TRUE(base::test::RunUntil([&]() {
-    return side_panel_coordinator->IsSidePanelShowing();
-  }));  // issue here
-
-  // Wait for the side panel to open fully.
-  SidePanel* side_panel =
-      BrowserView::GetBrowserViewForBrowser(browser())->unified_side_panel();
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return side_panel->GetAnimationValue() >= 1; }));
-
-  //   Showing UI should eventually result in overlay state. When the overlay is
-  //   bound, it should start the query flow which returns a response for the
-  //   interaction data callback.
-  controller->ShowUI(InvocationSource::kAppMenu);
-  ASSERT_TRUE(controller->state() == State::kClosingOpenedSidePanel);
-
-  // Wait for the side panel to start closing.
-  ASSERT_TRUE(base::test::RunUntil([&]() { return side_panel->IsClosing(); }));
-
-  // Reshow the side panel to prevent the side panel from closing.
-  side_panel_coordinator->Show(SidePanelEntry::Id::kBookmarks);
-
-  // Verify the overlay returns to kOff state.
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return controller->state() == State::kOff; }));
-
-  // Secondly, test the flow if the side panel is open with our results, if we
-  // close our UI and request the close the side panel, we gracefully handle a
-  // new side panel opening which prevents our requested close.
-  controller->ShowUI(InvocationSource::kAppMenu);
-
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return controller->state() == State::kOverlay; }));
-
-  // Open our results panel
-  controller->IssueTextSelectionRequestForTesting("test query",
-                                                  /*selection_start_index=*/0,
-                                                  /*selection_end_index=*/0);
-
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return controller->state() == State::kOverlayAndResults; }));
-
-  // Request a close which will start to close the side panel.
-  controller->CloseUIAsync(DismissalSource::kOverlayBackgroundClick);
-  ASSERT_TRUE(controller->state() == State::kClosingSidePanel);
-
-  // Reshow the side panel to prevent a the side panel from closing.
-  side_panel_coordinator->Show(SidePanelEntry::Id::kBookmarks);
-
-  // The overlay eventually returns to kOff state.
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return controller->state() == State::kOff; }));
-}
-
 }  // namespace
diff --git a/chrome/browser/ui/lens/lens_overlay_side_panel_navigation_throttle.cc b/chrome/browser/ui/lens/lens_overlay_side_panel_navigation_throttle.cc
index cd4a11f..42f6199 100644
--- a/chrome/browser/ui/lens/lens_overlay_side_panel_navigation_throttle.cc
+++ b/chrome/browser/ui/lens/lens_overlay_side_panel_navigation_throttle.cc
@@ -35,10 +35,10 @@
   // Only create the navigation throttle for this handle if it equals the side
   // panel web contents and the side panel is showing the lens overlay results
   // entry.
-  if (controller && controller->results_side_panel_coordinator() &&
-      controller->results_side_panel_coordinator()->IsEntryShowing() &&
-      (handle->GetWebContents() == controller->results_side_panel_coordinator()
-                                       ->GetSidePanelWebContents())) {
+  if (controller && controller->side_panel_coordinator() &&
+      controller->side_panel_coordinator()->IsEntryShowing() &&
+      (handle->GetWebContents() ==
+       controller->side_panel_coordinator()->GetSidePanelWebContents())) {
     return base::WrapUnique(new LensOverlaySidePanelNavigationThrottle(handle));
   }
 
diff --git a/chrome/browser/ui/test/test_browser_dialog.cc b/chrome/browser/ui/test/test_browser_dialog.cc
index 4c015e8..a693d7f 100644
--- a/chrome/browser/ui/test/test_browser_dialog.cc
+++ b/chrome/browser/ui/test/test_browser_dialog.cc
@@ -26,8 +26,8 @@
 #endif
 
 #if defined(TOOLKIT_VIEWS)
-#include "base/functional/callback_helpers.h"
 #include "base/strings/strcat.h"
+#include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/views/test/widget_test.h"
@@ -122,9 +122,9 @@
   bool is_active = dialog_widget->IsActive();
   dialog_widget->Deactivate();
   dialog_widget->GetFocusManager()->ClearFocus();
-  base::ScopedClosureRunner unblock_close(
-      base::BindOnce(&views::Widget::SetBlockCloseForTesting,
-                     base::Unretained(dialog_widget), false));
+  absl::Cleanup unblock_close = [dialog_widget] {
+    dialog_widget->SetBlockCloseForTesting(false);
+  };
 
   auto* test_info = testing::UnitTest::GetInstance()->current_test_info();
   const std::string screenshot_name = base::StrCat(
diff --git a/chrome/browser/ui/views/autofill/popup/popup_view_views.cc b/chrome/browser/ui/views/autofill/popup/popup_view_views.cc
index a51e04a..bdc0655 100644
--- a/chrome/browser/ui/views/autofill/popup/popup_view_views.cc
+++ b/chrome/browser/ui/views/autofill/popup/popup_view_views.cc
@@ -578,9 +578,8 @@
     return false;
   }
 
-  const SuggestionType type = controller_->GetSuggestionAt(index->first).type;
-  if (!base::Contains(kItemsTriggeringFieldFilling, type) &&
-      type != SuggestionType::kScanCreditCard) {
+  if (!IsStandaloneSuggestionType(
+          controller_->GetSuggestionAt(index->first).type)) {
     return false;
   }
 
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index dfa4a54..91f05ed6 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -442,13 +442,20 @@
   return false;
 }
 
-bool IsManagedGuestSession() {
 #if BUILDFLAG(IS_CHROMEOS)
-  return chromeos::IsManagedGuestSession();
-#else
-  return false;
-#endif
+// Returns whether immmersive fullscreen should replace fullscreen. This
+// should only occur for "browser-fullscreen" for tabbed-typed windows (not
+// for tab-fullscreen and not for app/popup type windows).
+bool ShouldUseImmersiveFullscreenForUrl(const GURL& url) {
+  // Kiosk mode needs the whole screen.
+  if (chrome::IsRunningInAppMode()) {
+    return false;
+  }
+  // An empty URL signifies browser fullscreen. Immersive is used for browser
+  // fullscreen only.
+  return url.is_empty();
 }
+#endif
 
 // Overlay view that owns TopContainerView in some cases (such as during
 // immersive fullscreen reveal).
@@ -1941,7 +1948,7 @@
     // Nothing to do.
     return;
   }
-  ProcessFullscreen(true, url, display_id);
+  ProcessFullscreen(true, display_id);
 }
 
 void BrowserView::ExitFullscreen() {
@@ -1951,7 +1958,7 @@
   if (IsForceFullscreen())
     return;
 
-  ProcessFullscreen(false, GURL(), display::kInvalidDisplayId);
+  ProcessFullscreen(false, display::kInvalidDisplayId);
 }
 
 void BrowserView::UpdateExclusiveAccessBubble(
@@ -1961,23 +1968,21 @@
   bool is_trusted_pinned =
       platform_util::IsBrowserLockedFullscreen(browser_.get());
 
-  // Immersive mode allows the toolbar to be shown, so do not show the bubble.
-  // However, do show the bubble in a managed guest session (see
-  // crbug.com/741069).
-  bool immersive_not_public = ShouldUseImmersiveFullscreenForUrl(params.url) &&
-                              !IsManagedGuestSession();
-
   // Whether we should remove the bubble if it exists, or not show the bubble.
   // TODO(jamescook): Figure out what to do with mouse-lock.
   bool should_close_bubble = is_trusted_pinned;
   if (!params.has_download) {
-    should_close_bubble = should_close_bubble ||
-                          // ...TYPE_NONE indicates deleting the bubble, except
-                          // when used with download.
-                          params.type == EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE ||
-                          // Immersive mode logic for downloads is handled by
-                          // the download controller.
-                          immersive_not_public;
+    // ...TYPE_NONE indicates deleting the bubble, except when used with
+    // download.
+    should_close_bubble |= params.type == EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE;
+#if BUILDFLAG(IS_CHROMEOS)
+    // Immersive mode allows the toolbar to be shown, so do not show the bubble.
+    // However, do show the bubble in a managed guest session (see
+    // crbug.com/741069).
+    // Immersive mode logic for downloads is handled by the download controller.
+    should_close_bubble |= ShouldUseImmersiveFullscreenForUrl(params.url) &&
+                           !chromeos::IsManagedGuestSession();
+#endif
   }
 
   if (should_close_bubble) {
@@ -2059,10 +2064,31 @@
     return;
   }
 
-  ProcessFullscreen(IsFullscreen(), GURL(), display::kInvalidDisplayId);
+  ProcessFullscreen(IsFullscreen(), display::kInvalidDisplayId);
 }
 
 void BrowserView::FullscreenStateChanged() {
+#if BUILDFLAG(IS_CHROMEOS)
+  if (platform_util::IsBrowserLockedFullscreen(browser_.get())) {
+    // Never use immersive in locked fullscreen as it allows the user to exit
+    // the locked mode.
+    immersive_mode_controller_->SetEnabled(false);
+  } else {
+    // Enable immersive before the browser refreshes its list of enabled
+    // commands.
+    bool should_stay_immersive =
+        !IsFullscreen() &&
+        immersive_mode_controller_->ShouldStayImmersiveAfterExitingFullscreen();
+    GURL url = IsFullscreen() ? GetExclusiveAccessManager()
+                                    ->fullscreen_controller()
+                                    ->GetURLForExclusiveAccessBubble()
+                              : GURL();
+    if (ShouldUseImmersiveFullscreenForUrl(url) && !should_stay_immersive) {
+      immersive_mode_controller_->SetEnabled(IsFullscreen());
+    }
+  }
+#endif
+
 #if BUILDFLAG(IS_MAC)
   if (AppUsesWindowControlsOverlay()) {
     UpdateWindowControlsOverlayEnabled();
@@ -4757,7 +4783,6 @@
 }
 
 void BrowserView::ProcessFullscreen(bool fullscreen,
-                                    const GURL& url,
                                     const int64_t display_id) {
   if (in_process_fullscreen_)
     return;
@@ -4795,19 +4820,6 @@
   // TODO(b/40276379): Move this out from ProcessFullscreen.
   RequestFullscreen(fullscreen, display_id);
 
-  // Enable immersive before the browser refreshes its list of enabled commands.
-  const bool should_stay_in_immersive =
-      !fullscreen &&
-      immersive_mode_controller_->ShouldStayImmersiveAfterExitingFullscreen();
-  // Never use immersive in locked fullscreen as it allows the user to exit the
-  // locked mode.
-  if (platform_util::IsBrowserLockedFullscreen(browser_.get())) {
-    immersive_mode_controller_->SetEnabled(false);
-  } else if (ShouldUseImmersiveFullscreenForUrl(url) &&
-             !should_stay_in_immersive) {
-    immersive_mode_controller_->SetEnabled(fullscreen);
-  }
-
 #if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_CHROMEOS_LACROS)
   // On Mac platforms, FullscreenStateChanged() is invoked from
   // BrowserFrameMac::OnWindowFullscreenTransitionComplete when the asynchronous
@@ -4889,20 +4901,6 @@
 #endif  // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
 }
 
-bool BrowserView::ShouldUseImmersiveFullscreenForUrl(const GURL& url) const {
-#if BUILDFLAG(IS_CHROMEOS)
-  // Kiosk mode needs the whole screen.
-  if (chrome::IsRunningInAppMode())
-    return false;
-  // An empty URL signifies browser fullscreen. Immersive is used for browser
-  // fullscreen only.
-  return url.is_empty();
-#else
-  // No immersive except in Chrome OS.
-  return false;
-#endif
-}
-
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 namespace {
 bool ShouldBeHandledByLacrosInstead(int command) {
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index e7337ad..b0faca0 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -948,13 +948,10 @@
   // so we
   // ask the window to change its fullscreen node_data, then when we get
   // notification that it succeeded this method is invoked.
-  // If |url| is not empty, it is the URL of the page that requested fullscreen
-  // (via the fullscreen JS API).
   // If the Window Placement experiment is enabled, fullscreen may be requested
   // on a particular display. In that case, |display_id| is the display's id;
   // otherwise, display::kInvalidDisplayId indicates no display is specified.
   void ProcessFullscreen(bool fullscreen,
-                         const GURL& url,
                          int64_t display_id);
 
   // Request the underlying platform to make the window fullscreen.
@@ -963,11 +960,6 @@
   void SynchronizeRenderWidgetHostVisualPropertiesForMainFrame();
   void NotifyWidgetSizeConstraintsChanged();
 
-  // Returns whether immmersive fullscreen should replace fullscreen. This
-  // should only occur for "browser-fullscreen" for tabbed-typed windows (not
-  // for tab-fullscreen and not for app/popup type windows).
-  bool ShouldUseImmersiveFullscreenForUrl(const GURL& url) const;
-
   // Copy the accelerator table from the app resources into something we can
   // use.
   void LoadAccelerators();
diff --git a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
index 1ae687a..605c5f4b 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
@@ -608,15 +608,6 @@
 
   SidePanelUtil::RecordSidePanelShowOrChangeEntryTrigger(open_trigger);
 
-  // If the side panel was in the process of closing, notify observers that the
-  // close was cancelled.
-  if (browser_view_->unified_side_panel()->IsClosing()) {
-    for (SidePanelViewStateObserver& view_state_observer :
-         view_state_observers_) {
-      view_state_observer.OnSidePanelCloseInterrupted();
-    }
-  }
-
   SidePanelContentSwappingContainer* content_wrapper =
       static_cast<SidePanelContentSwappingContainer*>(
           GetContentContainerView()->GetViewByID(
diff --git a/chrome/browser/ui/views/side_panel/side_panel_view_state_observer.h b/chrome/browser/ui/views/side_panel/side_panel_view_state_observer.h
index 3a41276..80d38e731e 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_view_state_observer.h
+++ b/chrome/browser/ui/views/side_panel/side_panel_view_state_observer.h
@@ -12,10 +12,6 @@
   // Called after opening the SidePanel.
   virtual void OnSidePanelDidOpen() {}
 
-  // Called when the side panel was in the process of closing, but a call to
-  // open the side panel interrupted the closing process.
-  virtual void OnSidePanelCloseInterrupted() {}
-
   // Called after closing the SidePanel.
   virtual void OnSidePanelDidClose() {}
 
diff --git a/chrome/browser/ui/views/web_apps/isolated_web_apps/isolated_web_app_installer_view_browsertest.cc b/chrome/browser/ui/views/web_apps/isolated_web_apps/isolated_web_app_installer_view_browsertest.cc
index d64062c..040b4ca 100644
--- a/chrome/browser/ui/views/web_apps/isolated_web_apps/isolated_web_app_installer_view_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/isolated_web_apps/isolated_web_app_installer_view_browsertest.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "base/files/file_path.h"
-#include "base/functional/callback_helpers.h"
 #include "base/stl_util.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/test/scoped_feature_list.h"
@@ -36,6 +35,7 @@
 #include "components/web_package/signed_web_bundles/signed_web_bundle_id.h"
 #include "content/public/common/content_features.h"
 #include "content/public/test/browser_test.h"
+#include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/views/test/widget_test.h"
 #include "ui/views/widget/widget.h"
@@ -150,9 +150,9 @@
     // is more predictable than activated dialog.
     widget->Deactivate();
     widget->GetFocusManager()->ClearFocus();
-    base::ScopedClosureRunner unblock_close(
-        base::BindOnce(&views::Widget::SetBlockCloseForTesting,
-                       base::Unretained(widget), false));
+    absl::Cleanup unblock_close = [widget] {
+      widget->SetBlockCloseForTesting(false);
+    };
 
     auto* test_info = testing::UnitTest::GetInstance()->current_test_info();
     const std::string screenshot_name =
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index 1907498d..c6ab7bb 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1715709564-a4b769f12bc09bb73cdfc35416e4fd2b06df7803-2d761419f76d9db6b6bfd25e9a8c997504a1b5ec.profdata
+chrome-android32-main-1715752637-d73e0428ab52676b054a28ad126fd48be561d525-526fde0b8062ca2d85118467e4768fbbbdd3c558.profdata
diff --git a/chrome/build/lacros64.pgo.txt b/chrome/build/lacros64.pgo.txt
index a188e0f7c..de41ea2 100644
--- a/chrome/build/lacros64.pgo.txt
+++ b/chrome/build/lacros64.pgo.txt
@@ -1 +1 @@
-chrome-chromeos-amd64-generic-main-1715687591-ae0c18f25f5617f89abab7bd69648410a1b73cce-f522de924a2d53304c5e9204558c0977615ad887.profdata
+chrome-chromeos-amd64-generic-main-1715731689-d62a8af7996c614f915751a9197a3235973fd96b-098d616775cdca5e2949df882bdfb392a10afdcc.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 03f97cf1..e4f65266 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1715731151-d8b317ef054cdd23d1e054dcc1c99a995804542f-9f936b25a29d93ea3f979aee6281670cae2b5a97.profdata
+chrome-mac-arm-main-1715752637-606a81f7e10fcb527a97fb2f7e0f907c279683a4-526fde0b8062ca2d85118467e4768fbbbdd3c558.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 3f8f508..d9155d5 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1715709564-29b9d5482833d3911fd860974613aced148fcb2c-2d761419f76d9db6b6bfd25e9a8c997504a1b5ec.profdata
+chrome-win-arm64-main-1715731151-59c2cce2fdb5ba706a9019201230ee9e2e55b599-9f936b25a29d93ea3f979aee6281670cae2b5a97.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 9d104c3f..719ecfd8 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1715720253-5e02d3a2a47c9a8ea1e5c0b3efec8fe38be892a7-07887c80db65b2341aa91f28d1d69dc80f3abc54.profdata
+chrome-win32-main-1715741848-8299249a9ebfcc4f0f01685a35a1300fae62e4dd-067561296e2a5ea4c7e550a3116c968c4560df4f.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 24a2bb2..c34ad6b5 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1715709564-27ff5852c6d9f2ad4eaca73d8bfec72604eac121-2d761419f76d9db6b6bfd25e9a8c997504a1b5ec.profdata
+chrome-win64-main-1715741848-50ba7fe60860359060368875d9518200b4e7bd57-067561296e2a5ea4c7e550a3116c968c4560df4f.profdata
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 0941cfb..6dd816c 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -6078,12 +6078,7 @@
     }
 
     if (!is_android) {
-      if (is_chromeos_lacros) {
-        # Work around crbug/1299041
-        data_deps += [ "//testing:run_perf_test" ]
-      } else {
-        data_deps += [ "//chrome/test:performance_browser_tests" ]
-      }
+      data_deps += [ "//testing:run_perf_test" ]
     }
   }
 }
diff --git a/chromeos/ash/components/dbus/audio/cras_audio_client.cc b/chromeos/ash/components/dbus/audio/cras_audio_client.cc
index 74fb9187..a4b5d16 100644
--- a/chromeos/ash/components/dbus/audio/cras_audio_client.cc
+++ b/chromeos/ash/components/dbus/audio/cras_audio_client.cc
@@ -377,6 +377,30 @@
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
   }
 
+  void SetStyleTransferEnabled(bool style_transfer_on) override {
+    VLOG(1) << "cras_audio_client: Setting style transfer state: "
+            << style_transfer_on;
+    dbus::MethodCall method_call(cras::kCrasControlInterface,
+                                 cras::kSetStyleTransferEnabled);
+
+    dbus::MessageWriter writer(&method_call);
+    writer.AppendBool(style_transfer_on);
+    cras_proxy_->CallMethod(&method_call,
+                            dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+                            base::DoNothing());
+  }
+
+  void GetStyleTransferSupported(
+      chromeos::DBusMethodCallback<bool> callback) override {
+    VLOG(1) << "cras_audio_client: Requesting style transfer support.";
+    dbus::MethodCall method_call(cras::kCrasControlInterface,
+                                 cras::kIsStyleTransferSupported);
+    cras_proxy_->CallMethod(
+        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+        base::BindOnce(&CrasAudioClientImpl::OnGetStyleTransferSupported,
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+  }
+
   void SetHfpMicSrEnabled(bool hfp_mic_sr_on) override {
     VLOG(1) << "cras_audio_client: Setting hfp_mic_sr state: " << hfp_mic_sr_on;
     dbus::MethodCall method_call(cras::kCrasControlInterface,
@@ -1210,6 +1234,26 @@
             << is_noise_cancellation_supported;
   }
 
+  void OnGetStyleTransferSupported(chromeos::DBusMethodCallback<bool> callback,
+                                   dbus::Response* response) {
+    if (!response) {
+      LOG(ERROR) << "Error calling GetStyleTransferSupported";
+      std::move(callback).Run(std::nullopt);
+      return;
+    }
+    bool is_style_transfer_supported = 0;
+    dbus::MessageReader reader(response);
+    if (!reader.PopBool(&is_style_transfer_supported)) {
+      LOG(ERROR) << "Error reading response from cras: "
+                 << response->ToString();
+      std::move(callback).Run(std::nullopt);
+      return;
+    }
+    std::move(callback).Run(is_style_transfer_supported);
+    VLOG(1) << "cras_audio_client: Retrieved style transfer support: "
+            << is_style_transfer_supported;
+  }
+
   void OnGetHfpMicSrSupported(chromeos::DBusMethodCallback<bool> callback,
                               dbus::Response* response) {
     if (!response) {
diff --git a/chromeos/ash/components/dbus/audio/cras_audio_client.h b/chromeos/ash/components/dbus/audio/cras_audio_client.h
index a2e1714d..6e06252e 100644
--- a/chromeos/ash/components/dbus/audio/cras_audio_client.h
+++ b/chromeos/ash/components/dbus/audio/cras_audio_client.h
@@ -185,6 +185,13 @@
   virtual void GetNoiseCancellationSupported(
       chromeos::DBusMethodCallback<bool> callback) = 0;
 
+  // Sets input style transfer state to |style_transfer_on| value.
+  virtual void SetStyleTransferEnabled(bool style_transfer_on) = 0;
+
+  // Gets if style transfer is supported.
+  virtual void GetStyleTransferSupported(
+      chromeos::DBusMethodCallback<bool> callback) = 0;
+
   // Sets the active output node to |node_id|.
   virtual void SetActiveOutputNode(uint64_t node_id) = 0;
 
diff --git a/chromeos/ash/components/dbus/audio/cras_audio_client_unittest.cc b/chromeos/ash/components/dbus/audio/cras_audio_client_unittest.cc
index 6f303228..6e15282c 100644
--- a/chromeos/ash/components/dbus/audio/cras_audio_client_unittest.cc
+++ b/chromeos/ash/components/dbus/audio/cras_audio_client_unittest.cc
@@ -1524,6 +1524,22 @@
   base::RunLoop().RunUntilIdle();
 }
 
+TEST_F(CrasAudioClientTest, SetStyleTransferEnabled) {
+  const bool kStyleTransferOn = true;
+  // Create response.
+  std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
+
+  // Set expectations.
+  PrepareForMethodCall(
+      cras::kSetStyleTransferEnabled,
+      base::BindRepeating(&ExpectBoolArgument, kStyleTransferOn),
+      response.get());
+  // Call method.
+  client()->SetStyleTransferEnabled(kStyleTransferOn);
+  // Run the message loop.
+  base::RunLoop().RunUntilIdle();
+}
+
 TEST_F(CrasAudioClientTest, SetHfpMicSrEnabled) {
   const bool kHfpMicSrOn = true;
   // Create response.
diff --git a/chromeos/ash/components/dbus/audio/fake_cras_audio_client.cc b/chromeos/ash/components/dbus/audio/fake_cras_audio_client.cc
index 023bea84d..0064393 100644
--- a/chromeos/ash/components/dbus/audio/fake_cras_audio_client.cc
+++ b/chromeos/ash/components/dbus/audio/fake_cras_audio_client.cc
@@ -254,6 +254,24 @@
   return noise_cancellation_enabled_counter_;
 }
 
+void FakeCrasAudioClient::SetStyleTransferSupported(
+    bool style_transfer_supported) {
+  style_transfer_supported_ = style_transfer_supported;
+}
+
+void FakeCrasAudioClient::SetStyleTransferEnabled(bool style_transfer_on) {
+  style_transfer_enabled_ = style_transfer_on;
+}
+
+void FakeCrasAudioClient::GetStyleTransferSupported(
+    chromeos::DBusMethodCallback<bool> callback) {
+  std::move(callback).Run(style_transfer_supported_);
+}
+
+bool FakeCrasAudioClient::GetStyleTransferEnabled() {
+  return style_transfer_enabled_;
+}
+
 void FakeCrasAudioClient::SetNumberOfNonChromeOutputStreams(int32_t streams) {
   number_non_chrome_output_streams_ = streams;
   for (auto& observer : observers_) {
diff --git a/chromeos/ash/components/dbus/audio/fake_cras_audio_client.h b/chromeos/ash/components/dbus/audio/fake_cras_audio_client.h
index f9627de..38ae388 100644
--- a/chromeos/ash/components/dbus/audio/fake_cras_audio_client.h
+++ b/chromeos/ash/components/dbus/audio/fake_cras_audio_client.h
@@ -33,6 +33,8 @@
 
   void SetNoiseCancellationSupported(bool noise_cancellation_supported);
   uint32_t GetNoiseCancellationEnabledCount();
+  void SetStyleTransferSupported(bool style_transfer_supported);
+  bool GetStyleTransferEnabled();
   void SetHfpMicSrSupported(bool hfp_mic_sr_supported);
   uint32_t GetHfpMicSrEnabled();
 
@@ -68,6 +70,9 @@
   void SetNoiseCancellationEnabled(bool noise_cancellation_on) override;
   void GetNoiseCancellationSupported(
       chromeos::DBusMethodCallback<bool> callback) override;
+  void SetStyleTransferEnabled(bool style_transfer_on) override;
+  void GetStyleTransferSupported(
+      chromeos::DBusMethodCallback<bool> callback) override;
   void SetActiveOutputNode(uint64_t node_id) override;
   void SetActiveInputNode(uint64_t node_id) override;
   void SetHotwordModel(uint64_t node_id,
@@ -171,6 +176,8 @@
     return noise_cancellation_enabled_;
   }
 
+  bool style_transfer_enabled() const { return style_transfer_enabled_; }
+
   bool speak_on_mute_detection_enabled() const {
     return speak_on_mute_detection_enabled_;
   }
@@ -194,10 +201,12 @@
   bool send_volume_change_events_synchronous_ = true;
   bool enable_gain_change_events_ = true;
   bool noise_cancellation_supported_ = false;
+  bool style_transfer_supported_ = false;
   uint32_t battery_level_ = 0;
   uint32_t noise_cancellation_enabled_counter_ = 0;
   int32_t number_non_chrome_output_streams_ = 0;
   bool noise_cancellation_enabled_ = false;
+  bool style_transfer_enabled_ = false;
   bool speak_on_mute_detection_enabled_ = false;
   bool force_respect_ui_gains_enabled_ = false;
   bool hfp_mic_sr_enabled_ = false;
diff --git a/clank b/clank
index 50916c4..59fdf4a 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 50916c402a360c88c140143c8f1d7f8de2f6d393
+Subproject commit 59fdf4ae057ef3cddc5ef6654ab847e45fcdde6e
diff --git a/components/autofill/content/common/mojom/autofill_driver.mojom b/components/autofill/content/common/mojom/autofill_driver.mojom
index ca6fac2..b83b2849f 100644
--- a/components/autofill/content/common/mojom/autofill_driver.mojom
+++ b/components/autofill/content/common/mojom/autofill_driver.mojom
@@ -203,7 +203,8 @@
   // Instructs the browser to show the popup for editing a generated password.
   // The location should be specified in the renderers coordinate system. Form
   // is the form associated with the password field. `field_renderer_id` is the
-  // ID of the password field triggering generation.
+  // ID of the password field triggering generation. This method does nothing on
+  // Android platform because showing popups there obscures the view too much.
   ShowPasswordEditingPopup(
     gfx.mojom.RectF bounds,
     FormData form_data,
diff --git a/components/autofill/core/browser/metrics/payments/payments_window_metrics.cc b/components/autofill/core/browser/metrics/payments/payments_window_metrics.cc
index 1e4bad3..f0ef4636 100644
--- a/components/autofill/core/browser/metrics/payments/payments_window_metrics.cc
+++ b/components/autofill/core/browser/metrics/payments/payments_window_metrics.cc
@@ -30,4 +30,13 @@
       "Autofill.Vcn3ds.PaymentsWindowUserConsentDialogShown", /*sample=*/true);
 }
 
+// Logs the duration that a VCN 3DS auth flow took. `duration` is the time
+// between when the pop-up was displayed to the user, and when the pop-up
+// closed. `success` is whether the auth was a success or failure.
+void LogVcn3dsAuthLatency(base::TimeDelta duration, bool success) {
+  base::UmaHistogramLongTimes(base::StrCat({"Autofill.Vcn3ds.Latency.",
+                                            success ? "Success" : "Failure"}),
+                              duration);
+}
+
 }  // namespace autofill::autofill_metrics
diff --git a/components/autofill/core/browser/metrics/payments/payments_window_metrics.h b/components/autofill/core/browser/metrics/payments/payments_window_metrics.h
index 89c2608..7936e9e 100644
--- a/components/autofill/core/browser/metrics/payments/payments_window_metrics.h
+++ b/components/autofill/core/browser/metrics/payments/payments_window_metrics.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_METRICS_PAYMENTS_PAYMENTS_WINDOW_METRICS_H_
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_METRICS_PAYMENTS_PAYMENTS_WINDOW_METRICS_H_
 
+#include "base/time/time.h"
+
 namespace autofill::autofill_metrics {
 
 // Metrics to track the flow events for a VCN 3DS authentication flow.
@@ -79,6 +81,11 @@
 // Logs when a PaymentsWindowUserConsentDialog is shown.
 void LogPaymentsWindowUserConsentDialogShown();
 
+// Logs the duration that a VCN 3DS auth flow took. `duration` is the time
+// between when the pop-up was displayed to the user, and when the pop-up
+// closed. `success` is whether the auth was a success or failure.
+void LogVcn3dsAuthLatency(base::TimeDelta duration, bool success);
+
 }  // namespace autofill::autofill_metrics
 
 #endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_METRICS_PAYMENTS_PAYMENTS_WINDOW_METRICS_H_
diff --git a/components/autofill/core/browser/ui/suggestion_type.h b/components/autofill/core/browser/ui/suggestion_type.h
index f7983af..0467f1de 100644
--- a/components/autofill/core/browser/ui/suggestion_type.h
+++ b/components/autofill/core/browser/ui/suggestion_type.h
@@ -7,8 +7,6 @@
 
 #include <ostream>
 
-#include "components/autofill/core/common/dense_set.h"
-
 namespace autofill {
 
 // This enum defines item identifiers for Autofill suggestion controller.
@@ -111,20 +109,6 @@
 
 std::ostream& operator<<(std::ostream& os, SuggestionType type);
 
-// TODO(b/340323759): Find a better name since Compose actions do not trigger
-// filling and kScanCreditCard should be included.
-// Set of `SuggestionType`s that trigger filling a value into an input element
-// when the user selects a suggestion with that id.
-inline constexpr auto kItemsTriggeringFieldFilling = DenseSet(
-    {SuggestionType::kAccountStoragePasswordEntry,
-     SuggestionType::kAddressEntry, SuggestionType::kAutocompleteEntry,
-     SuggestionType::kComposeResumeNudge,
-     SuggestionType::kComposeProactiveNudge, SuggestionType::kCreditCardEntry,
-     SuggestionType::kDatalistEntry,
-     SuggestionType::kFillEverythingFromAddressProfile,
-     SuggestionType::kMerchantPromoCodeEntry, SuggestionType::kPasswordEntry,
-     SuggestionType::kVirtualCreditCardEntry});
-
 }  // namespace autofill
 
 #endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_UI_SUGGESTION_TYPE_H_
diff --git a/components/browser_sync/sync_api_component_factory_impl.cc b/components/browser_sync/sync_api_component_factory_impl.cc
index 8985e40..ac5c81a 100644
--- a/components/browser_sync/sync_api_component_factory_impl.cc
+++ b/components/browser_sync/sync_api_component_factory_impl.cc
@@ -623,9 +623,7 @@
       std::make_unique<syncer::SyncTransportDataPrefs>(
           sync_client_->GetPrefService()),
       sync_client_->GetModelTypeStoreService()->GetSyncDataPath(),
-      engines_and_directory_deletion_thread_,
-      base::BindRepeating(&syncer::SyncClient::OnLocalSyncTransportDataCleared,
-                          base::Unretained(sync_client_)));
+      engines_and_directory_deletion_thread_);
 }
 
 bool SyncApiComponentFactoryImpl::HasTransportDataIncludingFirstSync() {
@@ -654,7 +652,6 @@
   }
 
   sync_transport_data_prefs.ClearAll();
-  sync_client_->OnLocalSyncTransportDataCleared();
 }
 
 std::unique_ptr<syncer::ModelTypeControllerDelegate>
diff --git a/components/exo/wayland/zcr_ui_controls.cc b/components/exo/wayland/zcr_ui_controls.cc
index 37fec94..8234ffee 100644
--- a/components/exo/wayland/zcr_ui_controls.cc
+++ b/components/exo/wayland/zcr_ui_controls.cc
@@ -138,7 +138,6 @@
   ash::ScreenOrientationControllerTestApi(
       ash::Shell::Get()->screen_orientation_controller())
       .UpdateNaturalOrientation();
-  state->original_displays_.clear();
   state->pending_display_.reset();
   state->pending_display_info_list_.clear();
 }
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal
index 34b2902..441a920 160000
--- a/components/optimization_guide/internal
+++ b/components/optimization_guide/internal
@@ -1 +1 @@
-Subproject commit 34b29022eb79491ade7c25cf27a350a3b640842b
+Subproject commit 441a92077f35cf38636bd61cc91d9a1bbbae43be
diff --git a/components/os_crypt/async/browser/os_crypt_async_unittest.cc b/components/os_crypt/async/browser/os_crypt_async_unittest.cc
index f61ba12c..5537b18 100644
--- a/components/os_crypt/async/browser/os_crypt_async_unittest.cc
+++ b/components/os_crypt/async/browser/os_crypt_async_unittest.cc
@@ -427,6 +427,16 @@
     ASSERT_TRUE(decrypted);
     EXPECT_EQ(*decrypted, "testsecrets");
   }
+  {
+    // Verify that the key used by the encryptor returned from the testing
+    // instance indicates compatibility with OSCrypt Sync. This avoids all tests
+    // having to install the OSCrypt mocker in every fixture.
+    auto another_encryptor =
+        GetInstanceSync(*os_crypt, Encryptor::Option::kEncryptSyncCompat);
+    auto decrypted = another_encryptor.DecryptData(*ciphertext);
+    ASSERT_TRUE(decrypted);
+    EXPECT_EQ(*decrypted, "testsecrets");
+  }
 }
 
 TEST_F(OSCryptAsyncTest, TestEncryptorInterface) {
diff --git a/components/os_crypt/async/browser/test_utils.cc b/components/os_crypt/async/browser/test_utils.cc
index 11e19d8f2..99e6941 100644
--- a/components/os_crypt/async/browser/test_utils.cc
+++ b/components/os_crypt/async/browser/test_utils.cc
@@ -19,14 +19,20 @@
 
 class TestOSCryptAsync : public OSCryptAsync {
  public:
-  TestOSCryptAsync()
+  explicit TestOSCryptAsync(bool is_sync_for_unittests)
       : OSCryptAsync(
             std::vector<std::pair<Precedence, std::unique_ptr<KeyProvider>>>()),
-        encryptor_(GetTestEncryptorForTesting()) {}
+        encryptor_(GetTestEncryptorForTesting()),
+        is_sync_for_unittests_(is_sync_for_unittests) {}
 
   [[nodiscard]] base::CallbackListSubscription GetInstance(
       InitCallback callback,
       Encryptor::Option option) override {
+    if (is_sync_for_unittests_) {
+      std::move(callback).Run(encryptor_.Clone(option), true);
+      return base::CallbackListSubscription();
+    }
+
     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
         FROM_HERE,
         base::BindOnce(
@@ -39,19 +45,28 @@
 
   static Encryptor GetTestEncryptorForTesting() {
     Encryptor::KeyRing keys;
-    std::vector<uint8_t> key(Encryptor::Key::kAES256GCMKeySize);
-    crypto::RandBytes(key);
-    keys.emplace("_", Encryptor::Key(key, mojom::Algorithm::kAES256GCM));
+    std::vector<uint8_t> key_data(Encryptor::Key::kAES256GCMKeySize);
+    crypto::RandBytes(key_data);
+    Encryptor::Key key(key_data, mojom::Algorithm::kAES256GCM);
+    // The test key used here indicates it is compatible with OSCrypt Sync
+    // because otherwise tests that ask for instances with the
+    // kEncryptSyncCompat option would fall back to OSCrypt Sync, and this
+    // requires the OSCrypt mocker to be installed, which should not be needed
+    // in tests and code ported to OSCrypt Async.
+    key.is_os_crypt_sync_compatible_ = true;
+    keys.emplace("_", std::move(key));
     Encryptor encryptor(std::move(keys), "_");
     return encryptor;
   }
 
  private:
   Encryptor encryptor_;
+  const bool is_sync_for_unittests_;
 };
 
-std::unique_ptr<OSCryptAsync> GetTestOSCryptAsyncForTesting() {
-  return std::make_unique<TestOSCryptAsync>();
+std::unique_ptr<OSCryptAsync> GetTestOSCryptAsyncForTesting(
+    bool is_sync_for_unittests) {
+  return std::make_unique<TestOSCryptAsync>(is_sync_for_unittests);
 }
 
 Encryptor GetTestEncryptorForTesting() {
diff --git a/components/os_crypt/async/browser/test_utils.h b/components/os_crypt/async/browser/test_utils.h
index deeb38be..5e0f426c6 100644
--- a/components/os_crypt/async/browser/test_utils.h
+++ b/components/os_crypt/async/browser/test_utils.h
@@ -12,8 +12,10 @@
 namespace os_crypt_async {
 
 // Obtain a test OSCryptAsync. This OSCryptAsync will vend test Encryptors that
-// perform encryption/decryption using a random test key.
-std::unique_ptr<OSCryptAsync> GetTestOSCryptAsyncForTesting();
+// perform encryption/decryption using a random test key. In unit tests without
+// a full task environment, `is_sync_for_unittests` can be set to true.
+std::unique_ptr<OSCryptAsync> GetTestOSCryptAsyncForTesting(
+    bool is_sync_for_unittests = false);
 
 // Obtain a test Encryptor. This Encryptor will perform encryption using a
 // random key. The key for test Encryptors is different each time this function
diff --git a/components/os_crypt/async/common/encryptor.h b/components/os_crypt/async/common/encryptor.h
index 6692c4b..46dee825 100644
--- a/components/os_crypt/async/common/encryptor.h
+++ b/components/os_crypt/async/common/encryptor.h
@@ -63,6 +63,7 @@
     friend class Encryptor;
     // OSCryptAsync and tests need to be able to Clone() keys.
     friend class OSCryptAsync;
+    friend class TestOSCryptAsync;
     friend class EncryptorTestBase;
     friend struct mojo::StructTraits<os_crypt_async::mojom::KeyDataView,
                                      os_crypt_async::Encryptor::Key>;
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc
index 2d1c865..ddea6234 100644
--- a/components/password_manager/core/browser/password_manager.cc
+++ b/components/password_manager/core/browser/password_manager.cc
@@ -371,10 +371,6 @@
   registry->RegisterIntegerPref(
       prefs::kPasswordGenerationNudgePasswordDismissCount, 0);
   registry->RegisterListPref(prefs::kPasswordManagerPromoCardsList);
-  registry->RegisterBooleanPref(
-      prefs::kAutofillableCredentialsProfileStoreLoginDatabase, false);
-  registry->RegisterBooleanPref(
-      prefs::kAutofillableCredentialsAccountStoreLoginDatabase, false);
 #endif  // BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
   registry->RegisterBooleanPref(prefs::kPasswordSharingEnabled, true);
 #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc
index 9e9e5d43..b6621c2f 100644
--- a/components/password_manager/core/common/password_manager_features.cc
+++ b/components/password_manager/core/common/password_manager_features.cc
@@ -85,11 +85,6 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 #if BUILDFLAG(IS_ANDROID)
-// Enables the Password generation bottom sheet.
-BASE_FEATURE(kPasswordGenerationBottomSheet,
-             "PasswordGenerationBottomSheet",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Enables the refactored Password Suggestion bottom sheet (Touch-To-Fill).
 // The goal of the refactoring is to transfer the knowledge about the
 // Touch-To-Fill feature to the browser code completely and so to simplify the
diff --git a/components/password_manager/core/common/password_manager_features.h b/components/password_manager/core/common/password_manager_features.h
index 73d8689..35e53572 100644
--- a/components/password_manager/core/common/password_manager_features.h
+++ b/components/password_manager/core/common/password_manager_features.h
@@ -36,7 +36,6 @@
 BASE_DECLARE_FEATURE(kShowWebauthnSuggestionsOnAutofocus);
 
 #if BUILDFLAG(IS_ANDROID)
-BASE_DECLARE_FEATURE(kPasswordGenerationBottomSheet);
 BASE_DECLARE_FEATURE(kPasswordSuggestionBottomSheetV2);
 BASE_DECLARE_FEATURE(kUnifiedPasswordManagerLocalPasswordsMigrationWarning);
 #endif
diff --git a/components/password_manager/core/common/password_manager_pref_names.h b/components/password_manager/core/common/password_manager_pref_names.h
index 656d417..a2bc27ef 100644
--- a/components/password_manager/core/common/password_manager_pref_names.h
+++ b/components/password_manager/core/common/password_manager_pref_names.h
@@ -318,14 +318,6 @@
 // in the Password Manager UI.
 inline constexpr char kPasswordManagerPromoCardsList[] =
     "password_manager.password_promo_cards_list";
-
-// A cache of whether the profile LoginDatabase has autofillable credentials.
-inline constexpr char kAutofillableCredentialsProfileStoreLoginDatabase[] =
-    "password_manager.autofillable_credentials_profile_store_login_database";
-
-// A cache of whether the account LoginDatabase has autofillable credentials.
-inline constexpr char kAutofillableCredentialsAccountStoreLoginDatabase[] =
-    "password_manager.autofillable_credentials_account_store_login_database";
 #endif
 
 // Boolean pref indicating whether password sharing is enabled. Enables both
diff --git a/components/policy/core/common/policy_pref_names.cc b/components/policy/core/common/policy_pref_names.cc
index dae5644a3..94f12b0 100644
--- a/components/policy/core/common/policy_pref_names.cc
+++ b/components/policy/core/common/policy_pref_names.cc
@@ -135,6 +135,12 @@
 const char kBeforeunloadEventCancelByPreventDefaultEnabled[] =
     "policy.beforeunload_event_cancel_by_prevent_default_enabled";
 
+// A boolean indicating whether scrollers should be focusable. If true, then
+// 1. Scrollers are click-focusable and programmatically-focusable by default.
+// 2. Scrollers without focusable children are keyboard-focusable by default.
+const char kKeyboardFocusableScrollersEnabled[] =
+    "policy.keyboard_focusable_scrollers_enabled";
+
 // Boolean indicating whether Policy Test Page is Enabled.
 // The value is controlled by the PolicyTestPageEnabled policy.
 // If this is set to True, the page will be accessible.
diff --git a/components/policy/core/common/policy_pref_names.h b/components/policy/core/common/policy_pref_names.h
index a31a3a2..7eabbfe 100644
--- a/components/policy/core/common/policy_pref_names.h
+++ b/components/policy/core/common/policy_pref_names.h
@@ -66,6 +66,7 @@
 extern const char kHideWebStoreIcon[];
 extern const char kIncognitoModeAvailability[];
 extern const char kBeforeunloadEventCancelByPreventDefaultEnabled[];
+extern const char kKeyboardFocusableScrollersEnabled[];
 extern const char kPolicyTestPageEnabled[];
 extern const char kAllowBackForwardCacheForCacheControlNoStorePageEnabled[];
 extern const char kLocalTestPoliciesForNextStartup[];
diff --git a/components/policy/resources/templates/policies.yaml b/components/policy/resources/templates/policies.yaml
index a2527b4..68de050 100644
--- a/components/policy/resources/templates/policies.yaml
+++ b/components/policy/resources/templates/policies.yaml
@@ -1256,6 +1256,8 @@
   1255: ContextualGoogleIntegrationsConfiguration
   1256: PdfViewerOutOfProcessIframeEnabled
   1257: LockScreenAutoStartOnlineReauth
+  1258: KeyboardFocusableScrollersEnabled
+
 atomic_groups:
   1: Homepage
   2: RemoteAccess
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/KeyboardFocusableScrollersEnabled.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/KeyboardFocusableScrollersEnabled.yaml
new file mode 100644
index 0000000..d1c726d
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/KeyboardFocusableScrollersEnabled.yaml
@@ -0,0 +1,32 @@
+caption: Enable keyboard focusable scrollers
+default: true
+desc: |-
+  This policy provides a temporary opt-out for the new keyboard focusable scrollers behavior.
+
+  When this policy is Enabled or unset, scrollers without focusable children are keyboard-focusable by default. Further, scrollers are click-focusable and programmatically-focusable by default.
+
+  When this policy is Disabled, scrollers will not be focusable by default.
+
+  This policy is a temporary workaround, and will be removed in M135.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+  - fuchsia
+items:
+  - caption: "Enabled: Scrollers are focusable by default."
+    value: true
+  - caption: "Disabled: Scrollers are not focusable by default."
+    value: false
+owners:
+  - dizhangg@chromium.org
+schema:
+  type: boolean
+supported_on:
+  - chrome.*:127-
+  - chrome_os:127-
+  - android:127-
+  - webview_android:127-
+tags: []
+type: main
diff --git a/components/policy/test/data/pref_mapping/KeyboardFocusableScrollersEnabled.json b/components/policy/test/data/pref_mapping/KeyboardFocusableScrollersEnabled.json
new file mode 100644
index 0000000..f204a50
--- /dev/null
+++ b/components/policy/test/data/pref_mapping/KeyboardFocusableScrollersEnabled.json
@@ -0,0 +1,21 @@
+[
+  {
+    "os": [
+      "win",
+      "linux",
+      "mac",
+      "chromeos_ash",
+      "chromeos_lacros",
+      "android",
+      "fuchsia"
+    ],
+    "simple_policy_pref_mapping_test": {
+      "pref_name": "policy.keyboard_focusable_scrollers_enabled",
+      "default_value": true,
+      "values_to_test": [
+        true,
+        false
+      ]
+    }
+  }
+]
diff --git a/components/sync/service/glue/sync_engine_impl.cc b/components/sync/service/glue/sync_engine_impl.cc
index 07a8ff3d..8d5fee0 100644
--- a/components/sync/service/glue/sync_engine_impl.cc
+++ b/components/sync/service/glue/sync_engine_impl.cc
@@ -105,12 +105,10 @@
     std::unique_ptr<ActiveDevicesProvider> active_devices_provider,
     std::unique_ptr<SyncTransportDataPrefs> prefs,
     const base::FilePath& sync_data_folder,
-    scoped_refptr<base::SequencedTaskRunner> sync_task_runner,
-    const base::RepeatingClosure& sync_transport_data_cleared_cb)
+    scoped_refptr<base::SequencedTaskRunner> sync_task_runner)
     : sync_task_runner_(std::move(sync_task_runner)),
       name_(name),
       prefs_(std::move(prefs)),
-      sync_transport_data_cleared_cb_(sync_transport_data_cleared_cb),
       sync_invalidations_service_(sync_invalidations_service),
       active_devices_provider_(std::move(active_devices_provider)),
       engine_created_time_for_metrics_(base::TimeTicks::Now()) {
@@ -137,7 +135,7 @@
     // everything away and start from scratch with a new cache GUID, which also
     // cascades into datatypes throwing away their dangling sync metadata due to
     // cache GUID mismatches.
-    ClearLocalTransportDataAndNotify();
+    prefs_->ClearAll();
     prefs_->SetCacheGuid(GenerateCacheGUID());
     prefs_->SetGaiaId(params.authenticated_account_info.gaia);
   }
@@ -296,7 +294,7 @@
   sync_task_runner_->ReleaseSoon(FROM_HERE, std::move(backend_));
 
   if (reason == ShutdownReason::DISABLE_SYNC_AND_CLEAR_DATA) {
-    ClearLocalTransportDataAndNotify();
+    prefs_->ClearAll();
   }
 }
 
@@ -602,11 +600,6 @@
   prefs_->SetLastSyncedTime(base::Time::Now());
 }
 
-void SyncEngineImpl::ClearLocalTransportDataAndNotify() {
-  prefs_->ClearAll();
-  sync_transport_data_cleared_cb_.Run();
-}
-
 void SyncEngineImpl::UpdateStandaloneInvalidationsState() {
   DCHECK(sync_invalidations_service_);
 
diff --git a/components/sync/service/glue/sync_engine_impl.h b/components/sync/service/glue/sync_engine_impl.h
index ebb4d1e..93d3230 100644
--- a/components/sync/service/glue/sync_engine_impl.h
+++ b/components/sync/service/glue/sync_engine_impl.h
@@ -48,8 +48,7 @@
                  std::unique_ptr<ActiveDevicesProvider> active_devices_provider,
                  std::unique_ptr<SyncTransportDataPrefs> prefs,
                  const base::FilePath& sync_data_folder,
-                 scoped_refptr<base::SequencedTaskRunner> sync_task_runner,
-                 const base::RepeatingClosure& sync_transport_data_cleared_cb);
+                 scoped_refptr<base::SequencedTaskRunner> sync_task_runner);
 
   SyncEngineImpl(const SyncEngineImpl&) = delete;
   SyncEngineImpl& operator=(const SyncEngineImpl&) = delete;
@@ -156,10 +155,6 @@
   // Sets the last synced time to the current time.
   void UpdateLastSyncedTime();
 
-  // Helper function that clears SyncTransportDataPrefs and also notifies
-  // upper layers via |sync_transport_data_cleared_cb_|.
-  void ClearLocalTransportDataAndNotify();
-
   // Updates the current state of standalone invalidations. Note that the
   // invalidations can be handled even if the invalidation service is not fully
   // initialized yet (e.g. while processing the incoming queue of messages
@@ -177,8 +172,6 @@
 
   const std::unique_ptr<SyncTransportDataPrefs> prefs_;
 
-  const base::RepeatingClosure sync_transport_data_cleared_cb_;
-
   // Our backend, which communicates directly to the syncapi. Use refptr instead
   // of WeakHandle because |backend_| is created on UI loop but released on
   // sync loop.
diff --git a/components/sync/service/glue/sync_engine_impl_unittest.cc b/components/sync/service/glue/sync_engine_impl_unittest.cc
index d359fbb..b8126b6 100644
--- a/components/sync/service/glue/sync_engine_impl_unittest.cc
+++ b/components/sync/service/glue/sync_engine_impl_unittest.cc
@@ -169,7 +169,7 @@
         std::move(mock_active_devices_provider),
         std::make_unique<SyncTransportDataPrefs>(&pref_service_),
         temp_dir_.GetPath().Append(base::FilePath(kTestSyncDir)),
-        std::move(sync_task_runner), sync_transport_data_cleared_cb_.Get());
+        std::move(sync_task_runner));
 
     fake_manager_factory_ = std::make_unique<FakeSyncManagerFactory>(
         &fake_manager_, network::TestNetworkConnectionTracker::GetInstance());
@@ -278,8 +278,6 @@
   base::ScopedTempDir temp_dir_;
   TestingPrefServiceSimple pref_service_;
   NiceMock<MockSyncEngineHost> mock_host_;
-  NiceMock<base::MockCallback<base::RepeatingClosure>>
-      sync_transport_data_cleared_cb_;
   std::unique_ptr<SyncEngineImpl> backend_;
   std::unique_ptr<FakeSyncManagerFactory> fake_manager_factory_;
   // This field is not a raw_ptr<> because it was filtered by the rewriter for:
@@ -300,7 +298,6 @@
   EXPECT_EQ(ControlTypes(), fake_manager_->GetAndResetDownloadedTypes());
   EXPECT_EQ(ControlTypes(), fake_manager_->InitialSyncEndedTypes());
 
-  EXPECT_CALL(sync_transport_data_cleared_cb_, Run()).Times(0);
   ShutdownBackend(ShutdownReason::STOP_SYNC_AND_KEEP_DATA);
 }
 
@@ -309,7 +306,6 @@
   EXPECT_EQ(ControlTypes(), fake_manager_->GetAndResetDownloadedTypes());
   EXPECT_EQ(ControlTypes(), fake_manager_->InitialSyncEndedTypes());
 
-  EXPECT_CALL(sync_transport_data_cleared_cb_, Run());
   ShutdownBackend(ShutdownReason::DISABLE_SYNC_AND_CLEAR_DATA);
 }
 
@@ -644,7 +640,6 @@
   transport_data_prefs.SetBirthday(kTestBirthday);
   transport_data_prefs.SetGaiaId(kTestGaiaId);
 
-  EXPECT_CALL(sync_transport_data_cleared_cb_, Run()).Times(0);
   InitializeBackend();
 
   EXPECT_EQ(kTestGaiaId, transport_data_prefs.GetGaiaId());
@@ -661,7 +656,6 @@
   transport_data_prefs.SetBirthday(kTestBirthday);
   transport_data_prefs.SetGaiaId("corrupt_gaia_id");
 
-  EXPECT_CALL(sync_transport_data_cleared_cb_, Run());
   InitializeBackend();
 
   EXPECT_EQ(kTestGaiaId, transport_data_prefs.GetGaiaId());
diff --git a/components/sync/service/sync_client.h b/components/sync/service/sync_client.h
index 1d1d5ad..650737f 100644
--- a/components/sync/service/sync_client.h
+++ b/components/sync/service/sync_client.h
@@ -68,12 +68,6 @@
   // Returns whether custom passphrase is allowed for the current user.
   virtual bool IsCustomPassphraseAllowed() = 0;
 
-  // Notifies the client that local sync metadata in preferences has been
-  // cleared.
-  // TODO(crbug.com/40724759): Replace this mechanism with a more universal one,
-  // e.g. using SyncServiceObserver.
-  virtual void OnLocalSyncTransportDataCleared() = 0;
-
   // Necessary but not sufficient condition for password sync to be enabled,
   // i.e. it influences the value of SyncUserSettings::GetSelectedTypes().
   // TODO(crbug.com/328190573): Remove this and SetPasswordSyncAllowedChangeCb()
diff --git a/components/sync/service/sync_service_impl.cc b/components/sync/service/sync_service_impl.cc
index 43d1dd9..ce7f6c8 100644
--- a/components/sync/service/sync_service_impl.cc
+++ b/components/sync/service/sync_service_impl.cc
@@ -383,7 +383,7 @@
   // If sync is disabled permanently, clean up old data that may be around (e.g.
   // crash during signout).
   if (HasDisableReason(DISABLE_REASON_ENTERPRISE_POLICY)) {
-    StopAndClear();
+    StopAndClear(ResetEngineReason::kEnterprisePolicy);
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     // On ChromeOS Ash, sync-the-feature stays disabled even after the policy is
     // removed, for historic reasons. It is unclear if this behavior is
@@ -400,7 +400,7 @@
     // first startup of a fresh profile, the signed-in account isn't known yet
     // at this point (see also https://crbug.com/1458701#c7).
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-    StopAndClear();
+    StopAndClear(ResetEngineReason::kNotSignedIn);
 #endif
   }
 
@@ -512,6 +512,9 @@
     case ResetEngineReason::kDisabledAccount:
     case ResetEngineReason::kResetLocalData:
     case ResetEngineReason::kStopAndClear:
+    case ResetEngineReason::kNotSignedIn:
+    case ResetEngineReason::kEnterprisePolicy:
+    case ResetEngineReason::kDisableSyncOnClient:
       return ShutdownReason::DISABLE_SYNC_AND_CLEAR_DATA;
   }
 }
@@ -522,7 +525,7 @@
   if (!IsSignedIn()) {
     // The account was signed out, so shut down.
     sync_disabled_by_admin_ = false;
-    StopAndClear();
+    StopAndClear(ResetEngineReason::kNotSignedIn);
     DCHECK(!engine_);
   } else {
     // Either a new account was signed in, or the existing account's
@@ -1168,7 +1171,7 @@
       // Note: This method might get called again in the following code when
       // clearing the primary account. But due to rarity of the event, this
       // should be okay.
-      StopAndClear();
+      StopAndClear(ResetEngineReason::kDisableSyncOnClient);
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
       // On Ash, the primary account is always set and sync the feature
@@ -1848,7 +1851,7 @@
   }
 
   if (is_sync_managed) {
-    StopAndClear();
+    StopAndClear(ResetEngineReason::kEnterprisePolicy);
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     // On ChromeOS Ash, sync-the-feature stays disabled even after the policy is
     // removed, for historic reasons. It is unclear if this behavior is
@@ -2250,21 +2253,25 @@
 }
 
 void SyncServiceImpl::StopAndClear() {
+  StopAndClear(ResetEngineReason::kStopAndClear);
+}
+
+void SyncServiceImpl::StopAndClear(ResetEngineReason reset_engine_reason) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   ClearUnrecoverableError();
-  ResetEngine(ResetEngineReason::kStopAndClear);
-  // Note: ResetEngine(kStopAndClear) does *not* clear prefs which
-  // are directly user-controlled such as the set of selected types here, so
-  // that if the user ever chooses to enable Sync again, they start off with
-  // their previous settings by default. We do however require going through
-  // first-time setup again and set SyncRequested to false.
+  ResetEngine(reset_engine_reason);
+
   // For explicit passphrase users, clear the encryption key, such that they
   // will need to reenter it if sync gets re-enabled. Note: the gaia-keyed
   // passphrase pref should be cleared before clearing
   // InitialSyncFeatureSetupComplete().
   sync_prefs_.ClearAllEncryptionBootstrapTokens();
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
+  // Note: ResetEngine() does *not* clear directly user-controlled prefs (such
+  // as the set of selected types), so that if the user ever chooses to enable
+  // Sync again, they start off with their previous settings by default.
+  // However, they do have to go through the initial setup again.
   sync_prefs_.ClearInitialSyncFeatureSetupComplete();
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
   sync_prefs_.ClearPassphrasePromptMutedProductVersion();
diff --git a/components/sync/service/sync_service_impl.h b/components/sync/service/sync_service_impl.h
index e5527c1..28540c8 100644
--- a/components/sync/service/sync_service_impl.h
+++ b/components/sync/service/sync_service_impl.h
@@ -279,8 +279,11 @@
     // kSetSyncAllowedByPlatform = 5,
     kCredentialsChanged = 6,
     kResetLocalData = 7,
+    kNotSignedIn = 8,
+    kEnterprisePolicy = 9,
+    kDisableSyncOnClient = 10,
 
-    kMaxValue = kResetLocalData
+    kMaxValue = kDisableSyncOnClient
   };
   // LINT.ThenChange(/tools/metrics/histograms/metadata/sync/enums.xml:SyncResetEngineReason)
 
@@ -319,6 +322,8 @@
     ModelTypeSet data_types_to_track_;
   };
 
+  void StopAndClear(ResetEngineReason reset_engine_reason);
+
   // Callbacks for SyncAuthManager.
   void AccountStateChanged();
   void CredentialsChanged();
diff --git a/components/sync/test/sync_client_mock.h b/components/sync/test/sync_client_mock.h
index e261d09..7f9fb4b 100644
--- a/components/sync/test/sync_client_mock.h
+++ b/components/sync/test/sync_client_mock.h
@@ -47,7 +47,6 @@
               (),
               (override));
   MOCK_METHOD(bool, IsCustomPassphraseAllowed, (), (override));
-  MOCK_METHOD(void, OnLocalSyncTransportDataCleared, (), (override));
   MOCK_METHOD(bool, IsPasswordSyncAllowed, (), (override));
   MOCK_METHOD(void,
               SetPasswordSyncAllowedChangeCb,
diff --git a/components/sync_preferences/BUILD.gn b/components/sync_preferences/BUILD.gn
index 0ff3e7d6..24afc57 100644
--- a/components/sync_preferences/BUILD.gn
+++ b/components/sync_preferences/BUILD.gn
@@ -28,6 +28,7 @@
   deps = [
     "//base",
     "//build:chromeos_buildflags",
+    "//components/metrics/demographics",
     "//components/policy/core/browser",
     "//components/pref_registry",
     "//components/prefs",
diff --git a/components/sync_preferences/DEPS b/components/sync_preferences/DEPS
index f27b93f..5cda498 100644
--- a/components/sync_preferences/DEPS
+++ b/components/sync_preferences/DEPS
@@ -1,5 +1,6 @@
 include_rules = [
   "+ash/constants",
+  "+components/metrics/demographics",
   "+components/policy/core/browser",
   "+components/policy/core/common",
   "+components/pref_registry",
diff --git a/components/sync_preferences/pref_service_syncable.cc b/components/sync_preferences/pref_service_syncable.cc
index f0273ef..b1d9169 100644
--- a/components/sync_preferences/pref_service_syncable.cc
+++ b/components/sync_preferences/pref_service_syncable.cc
@@ -11,7 +11,9 @@
 #include "base/functional/callback.h"
 #include "base/functional/callback_helpers.h"
 #include "base/observer_list.h"
+#include "base/scoped_observation.h"
 #include "build/chromeos_buildflags.h"
+#include "components/metrics/demographics/user_demographics.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/in_memory_pref_store.h"
 #include "components/prefs/overlay_user_pref_store.h"
@@ -19,6 +21,7 @@
 #include "components/prefs/pref_registry.h"
 #include "components/prefs/pref_value_store.h"
 #include "components/sync/base/features.h"
+#include "components/sync/service/sync_service.h"
 #include "components/sync_preferences/dual_layer_user_pref_store.h"
 #include "components/sync_preferences/pref_model_associator.h"
 #include "components/sync_preferences/pref_service_syncable_observer.h"
@@ -30,6 +33,42 @@
 
 namespace sync_preferences {
 
+class PrefServiceSyncable::DemographicsPrefsClearer
+    : public syncer::SyncServiceObserver {
+ public:
+  DemographicsPrefsClearer(PrefService* pref_service,
+                           syncer::SyncService* sync_service)
+      : pref_service_(pref_service) {
+    if (sync_service) {
+      sync_observation_.Observe(sync_service);
+    }
+  }
+
+  void OnStateChanged(syncer::SyncService* sync) override {
+    switch (sync->GetTransportState()) {
+      case syncer::SyncService::TransportState::DISABLED:
+        metrics::ClearDemographicsPrefs(pref_service_);
+        break;
+      case syncer::SyncService::TransportState::PAUSED:
+      case syncer::SyncService::TransportState::START_DEFERRED:
+      case syncer::SyncService::TransportState::INITIALIZING:
+      case syncer::SyncService::TransportState::PENDING_DESIRED_CONFIGURATION:
+      case syncer::SyncService::TransportState::CONFIGURING:
+      case syncer::SyncService::TransportState::ACTIVE:
+        break;
+    }
+  }
+
+  void OnSyncShutdown(syncer::SyncService* sync) override {
+    sync_observation_.Reset();
+  }
+
+ private:
+  const raw_ptr<PrefService> pref_service_;
+  base::ScopedObservation<syncer::SyncService, syncer::SyncServiceObserver>
+      sync_observation_{this};
+};
+
 PrefServiceSyncable::PrefServiceSyncable(
     std::unique_ptr<PrefNotifierImpl> pref_notifier,
     std::unique_ptr<PrefValueStore> pref_value_store,
@@ -289,6 +328,8 @@
   if (dual_layer_user_prefs_) {
     dual_layer_user_prefs_->OnSyncServiceInitialized(sync_service);
   }
+  demographics_prefs_clearer_ =
+      std::make_unique<DemographicsPrefsClearer>(this, sync_service);
 }
 
 }  // namespace sync_preferences
diff --git a/components/sync_preferences/pref_service_syncable.h b/components/sync_preferences/pref_service_syncable.h
index 5f5513b..23f0a27 100644
--- a/components/sync_preferences/pref_service_syncable.h
+++ b/components/sync_preferences/pref_service_syncable.h
@@ -88,10 +88,6 @@
   // preferences. If true is returned it can be assumed the local preferences
   // has applied changes from the remote preferences. The two may not be
   // identical if a change is in flight (from either side).
-  //
-  // TODO(albertb): Given that we now support priority preferences, callers of
-  // this method are likely better off making the preferences they care about
-  // into priority preferences and calling IsPrioritySyncing().
   bool IsSyncing();
 
   // Returns true if priority preferences state has synchronized with the remote
@@ -122,6 +118,8 @@
   void OnSyncServiceInitialized(syncer::SyncService* sync_service);
 
  private:
+  class DemographicsPrefsClearer;
+
   void ConnectAssociatorsAndRegisterPreferences();
 
   void AddRegisteredSyncablePreference(const std::string& path, uint32_t flags);
@@ -152,6 +150,8 @@
   // DualLayerUserPrefStore instance passed to the associators. This is non-null
   // iff EnablePreferencesAccountStorage feature is enabled.
   scoped_refptr<DualLayerUserPrefStore> dual_layer_user_prefs_;
+
+  std::unique_ptr<DemographicsPrefsClearer> demographics_prefs_clearer_;
 };
 
 }  // namespace sync_preferences
diff --git a/content/app_shim_remote_cocoa/web_drag_source_mac.mm b/content/app_shim_remote_cocoa/web_drag_source_mac.mm
index 4936ff1..e952c88 100644
--- a/content/app_shim_remote_cocoa/web_drag_source_mac.mm
+++ b/content/app_shim_remote_cocoa/web_drag_source_mac.mm
@@ -316,7 +316,7 @@
   }
 
   // Oops! Unknown drag pasteboard type.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return [NSData data];
 }
 
diff --git a/content/browser/accessibility/accessibility_tree_formatter_android.cc b/content/browser/accessibility/accessibility_tree_formatter_android.cc
index b569fb0..365b2438 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_android.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_android.cc
@@ -110,7 +110,7 @@
 
 base::Value::Dict AccessibilityTreeFormatterAndroid::BuildTreeForSelector(
     const AXTreeSelector& selector) const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return base::Value::Dict();
 }
 
diff --git a/content/browser/accessibility/accessibility_tree_formatter_blink.cc b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
index 7fb68f9..527f42c 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_blink.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
@@ -255,7 +255,7 @@
 
 base::Value::Dict AccessibilityTreeFormatterBlink::BuildTreeForSelector(
     const AXTreeSelector& selector) const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return base::Value::Dict();
 }
 
@@ -794,7 +794,7 @@
             &line);
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
   }
diff --git a/content/browser/accessibility/accessibility_tree_formatter_fuchsia.cc b/content/browser/accessibility/accessibility_tree_formatter_fuchsia.cc
index 383b020..7836d20 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_fuchsia.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_fuchsia.cc
@@ -89,7 +89,7 @@
     case FuchsiaRole::kUnknown:
       return "UNKNOWN";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return std::string();
   }
 }
@@ -111,7 +111,7 @@
     case FuchsiaAction::kShowOnScreen:
       return "SHOW_ON_SCREEN";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return std::string();
   }
 }
@@ -139,7 +139,7 @@
     case FuchsiaCheckedState::kMixed:
       return "MIXED";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return std::string();
   }
 }
@@ -153,7 +153,7 @@
     case FuchsiaToggledState::kIndeterminate:
       return "INDETERMINATE";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return std::string();
   }
 }
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index 7f6f49c..49ea5e6 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -72,7 +72,7 @@
 #if DCHECK_IS_ON()
   if (++browser_accessibility_count > kDumpBrowserAccessibilityLeakNumObjects &&
       !has_dumped_possible_leak) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     has_dumped_possible_leak = true;
   }
 #endif
@@ -901,7 +901,7 @@
     ui::AXPlatformNodeDelegate* end) {
   // This method is only called on Windows. Other platforms should not call it.
   // The BrowserAccessibilityWin subclass overrides this method.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return {};
 }
 
@@ -1954,7 +1954,7 @@
     int start_offset,
     ui::TextAttributeMap* text_attributes) {
   if (!text_attributes) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc
index 57fa983..d3c038e 100644
--- a/content/browser/accessibility/browser_accessibility_android.cc
+++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -258,7 +258,7 @@
       return false;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return true;
 }
 
@@ -1447,7 +1447,7 @@
       x = std::clamp(x_initial + page_x, x_min, x_max);
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   manager()->SetScrollOffset(*this, gfx::Point(x, y));
@@ -1710,7 +1710,7 @@
       GetWordBoundaries(starts, ends, offset);
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm
index 287ea10..73d6beea 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.mm
+++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -1363,7 +1363,7 @@
     case ax::mojom::SortDirection::kOther:
       return NSAccessibilityUnknownSortDirectionValue;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   return nil;
diff --git a/content/browser/accessibility/browser_accessibility_com_win.cc b/content/browser/accessibility/browser_accessibility_com_win.cc
index 954f2cb..0593ea3d5 100644
--- a/content/browser/accessibility/browser_accessibility_com_win.cc
+++ b/content/browser/accessibility/browser_accessibility_com_win.cc
@@ -1792,7 +1792,7 @@
 
   switch (direction) {
     case ax::mojom::MoveDirection::kNone:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return start_offset;
     case ax::mojom::MoveDirection::kBackward: {
       if (offset_to_text_attributes().empty())
@@ -1811,7 +1811,7 @@
     }
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return start_offset;
 }
 
diff --git a/content/browser/accessibility/browser_accessibility_mac.mm b/content/browser/accessibility/browser_accessibility_mac.mm
index 5e72bd2e..583529f3 100644
--- a/content/browser/accessibility/browser_accessibility_mac.mm
+++ b/content/browser/accessibility/browser_accessibility_mac.mm
@@ -61,8 +61,9 @@
   // could have never called this method without a platform node having been
   // created.
   if (!platform_node_) {
-    NOTREACHED() << "No platform node exists, so there should not be any "
-                    "native wrapper to replace.";
+    NOTREACHED_IN_MIGRATION()
+        << "No platform node exists, so there should not be any "
+           "native wrapper to replace.";
     return;
   }
 
@@ -74,7 +75,8 @@
   // We should have never called this method if a native wrapper has not been
   // created, but keep a null check just in case.
   if (!old_native_obj) {
-    NOTREACHED() << "No native wrapper exists, so there is nothing to replace.";
+    NOTREACHED_IN_MIGRATION()
+        << "No native wrapper exists, so there is nothing to replace.";
     return;
   }
 
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
index 348fe40..3fbe192 100644
--- a/content/browser/accessibility/browser_accessibility_manager.cc
+++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -979,7 +979,8 @@
     case ax::mojom::Action::kScrollRight:
       break;
     default:
-      NOTREACHED() << "Cannot call Scroll with action=" << scroll_action;
+      NOTREACHED_IN_MIGRATION()
+          << "Cannot call Scroll with action=" << scroll_action;
   }
   ui::AXActionData action_data;
   action_data.action = scroll_action;
@@ -1907,7 +1908,7 @@
     // ClusterFuzz was able to come up with a reliably-reproducible test case
     // which can be seen in https://crbug.com/1362230. This needs to be
     // investigated further.
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return nullptr;
   }
   return GetFromAXNode(RetargetForEvents(node->node(), event_type));
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc
index c5ac22c..381a62f 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -110,7 +110,7 @@
   // this. So we are temporarily using NOTREACHED in the hopes that ClusterFuzz
   // will lead to a reliably-reproducible test case.
   if (!node) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return nullptr;
   }
 
@@ -156,7 +156,7 @@
       break;
     }
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   return updated ? updated->node() : nullptr;
@@ -474,7 +474,7 @@
       break;
     }
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   return true;
@@ -522,7 +522,7 @@
       break;
     }
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   return true;
diff --git a/content/browser/android/battery_metrics.cc b/content/browser/android/battery_metrics.cc
index 3585d83..b0e83d6c 100644
--- a/content/browser/android/battery_metrics.cc
+++ b/content/browser/android/battery_metrics.cc
@@ -177,7 +177,7 @@
 
 AndroidBatteryMetrics::~AndroidBatteryMetrics() {
   // Never called, this is a no-destruct singleton.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void AndroidBatteryMetrics::InitializeOnSequence() {
diff --git a/content/browser/android/gesture_listener_manager.cc b/content/browser/android/gesture_listener_manager.cc
index 2da95e3..72ee3c4 100644
--- a/content/browser/android/gesture_listener_manager.cc
+++ b/content/browser/android/gesture_listener_manager.cc
@@ -62,8 +62,8 @@
       return ui::GESTURE_EVENT_TYPE_PINCH_BY;
     case WebInputEvent::Type::kGestureTwoFingerTap:
     default:
-      NOTREACHED() << "Invalid source gesture type: "
-                   << WebInputEvent::GetName(type);
+      NOTREACHED_IN_MIGRATION()
+          << "Invalid source gesture type: " << WebInputEvent::GetName(type);
       return -1;
   }
 }
diff --git a/content/browser/android/ime_adapter_android.cc b/content/browser/android/ime_adapter_android.cc
index cd0343a..a9c5353 100644
--- a/content/browser/android/ime_adapter_android.cc
+++ b/content/browser/android/ime_adapter_android.cc
@@ -429,7 +429,7 @@
               env->GetDirectBufferAddress(jgesture_data_byte_buffer.obj())),
           env->GetDirectBufferCapacity(jgesture_data_byte_buffer.obj()),
           &gesture_data)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
diff --git a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
index 9cb33ef..8ba4426 100644
--- a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
+++ b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
@@ -128,7 +128,7 @@
       break;
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   return result;
@@ -192,7 +192,7 @@
       break;
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   return result;
@@ -252,7 +252,7 @@
       break;
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   return result;
@@ -312,7 +312,7 @@
       break;
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   return result;
@@ -347,7 +347,7 @@
     case JavaType::TypeArray:
     case JavaType::TypeObject:
       // Not handled.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return nullptr;
 }
@@ -403,7 +403,7 @@
     case JavaType::TypeArray:
     case JavaType::TypeObject:
       // Not handled.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   base::android::CheckException(env);
 }
@@ -465,7 +465,7 @@
       break;
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   return result;
@@ -683,7 +683,7 @@
       break;
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   return result;
@@ -720,7 +720,7 @@
                                                 coerce_to_string, error);
     }
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return jvalue();
 }
@@ -772,7 +772,7 @@
           env, value, target_type, coerce_to_string, object_refs, error);
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return jvalue();
 }
 
diff --git a/content/browser/android/java/java_type.cc b/content/browser/android/java/java_type.cc
index e342b198..dfc4d70 100644
--- a/content/browser/android/java/java_type.cc
+++ b/content/browser/android/java/java_type.cc
@@ -62,7 +62,7 @@
       break;
     default:
       // Includes void (V).
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return result;
 }
@@ -155,7 +155,7 @@
     case JavaType::TypeObject:
       return class_jni_name;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::string();
 }
 
diff --git a/content/browser/android/message_payload.cc b/content/browser/android/message_payload.cc
index d987981..4dd73da 100644
--- a/content/browser/android/message_payload.cc
+++ b/content/browser/android/message_payload.cc
@@ -109,7 +109,8 @@
     case MessagePayloadType::kInvalid:
       break;
   }
-  NOTREACHED() << "Unsupported or invalid Java MessagePayload type.";
+  NOTREACHED_IN_MIGRATION()
+      << "Unsupported or invalid Java MessagePayload type.";
   return std::u16string();
 }
 
diff --git a/content/browser/back_forward_cache_basics_browsertest.cc b/content/browser/back_forward_cache_basics_browsertest.cc
index 7714856..10a2986b 100644
--- a/content/browser/back_forward_cache_basics_browsertest.cc
+++ b/content/browser/back_forward_cache_basics_browsertest.cc
@@ -1271,7 +1271,7 @@
   std::string GetMainFramePath() {
     switch (GetParam()) {
       case TestFrameType::kMainFrame:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return "";
       case TestFrameType::kSubFrame:
         return "/back_forward_cache/controllable_subframe.html";
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc
index 42928a72..bff0fcdf 100644
--- a/content/browser/back_forward_cache_browsertest.cc
+++ b/content/browser/back_forward_cache_browsertest.cc
@@ -2900,7 +2900,7 @@
               kUnloadHandlerExistsInSubFrame);
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   // 2) Navigate to B.
diff --git a/content/browser/background_fetch/background_fetch_event_dispatcher.cc b/content/browser/background_fetch/background_fetch_event_dispatcher.cc
index c50e2db..64e44a41 100644
--- a/content/browser/background_fetch/background_fetch_event_dispatcher.cc
+++ b/content/browser/background_fetch/background_fetch_event_dispatcher.cc
@@ -38,7 +38,7 @@
     case ServiceWorkerMetrics::EventType::BACKGROUND_FETCH_SUCCESS:
       return "BackgroundFetchSuccessEvent";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return std::string();
   }
 }
@@ -99,7 +99,7 @@
                                        std::move(finished_closure));
       return;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void BackgroundFetchEventDispatcher::DispatchBackgroundFetchAbortEvent(
diff --git a/content/browser/background_fetch/background_fetch_job_controller.cc b/content/browser/background_fetch/background_fetch_job_controller.cc
index ebd92c7..7472beb7 100644
--- a/content/browser/background_fetch/background_fetch_job_controller.cc
+++ b/content/browser/background_fetch/background_fetch_job_controller.cc
@@ -352,7 +352,7 @@
       Abort(BackgroundFetchFailureReason::QUOTA_EXCEEDED, base::DoNothing());
       return;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   if (completed_downloads_ == total_downloads_) {
diff --git a/content/browser/background_fetch/background_fetch_service_unittest.cc b/content/browser/background_fetch/background_fetch_service_unittest.cc
index 25b8095..90517f4 100644
--- a/content/browser/background_fetch/background_fetch_service_unittest.cc
+++ b/content/browser/background_fetch/background_fetch_service_unittest.cc
@@ -683,7 +683,7 @@
         EXPECT_FALSE(ContainsHeader(fetches[i]->response->headers, "X-Cat"));
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
 
     // TODO(peter): change-detector tests for unsupported properties.
@@ -787,7 +787,7 @@
         EXPECT_FALSE(fetches[i]->response);
         continue;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
 
     EXPECT_TRUE(fetches[i]->response->headers.empty());
diff --git a/content/browser/background_fetch/storage/database_helpers.cc b/content/browser/background_fetch/storage/database_helpers.cc
index 21f57c4..d1ff5fb 100644
--- a/content/browser/background_fetch/storage/database_helpers.cc
+++ b/content/browser/background_fetch/storage/database_helpers.cc
@@ -96,7 +96,7 @@
     case blink::ServiceWorkerStatusCode::kErrorInvalidArguments:
       break;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return DatabaseStatus::kFailed;
 }
 
@@ -122,7 +122,7 @@
       registration_data->result = blink::mojom::BackgroundFetchResult::SUCCESS;
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   bool did_convert = MojoFailureReasonFromRegistrationProto(
@@ -214,7 +214,7 @@
   else if (split.size() == 2u)
     replacements.SetQueryStr(split[0]);
   else
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 
   return url.ReplaceComponents(replacements);
 }
diff --git a/content/browser/bluetooth/bluetooth_metrics.cc b/content/browser/bluetooth/bluetooth_metrics.cc
index 4d7692c..30be2b5 100644
--- a/content/browser/bluetooth/bluetooth_metrics.cc
+++ b/content/browser/bluetooth/bluetooth_metrics.cc
@@ -151,7 +151,7 @@
     case CacheQueryOutcome::SUCCESS:
     case CacheQueryOutcome::BAD_RENDERER:
       // No need to record a success or renderer crash.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return UMAGATTOperationOutcome::kNotSupported;
     case CacheQueryOutcome::NO_DEVICE:
       return UMAGATTOperationOutcome::kNoDevice;
diff --git a/content/browser/bluetooth/web_bluetooth_pairing_manager_impl_unittest.cc b/content/browser/bluetooth/web_bluetooth_pairing_manager_impl_unittest.cc
index d5bd746..95766fe 100644
--- a/content/browser/bluetooth/web_bluetooth_pairing_manager_impl_unittest.cc
+++ b/content/browser/bluetooth/web_bluetooth_pairing_manager_impl_unittest.cc
@@ -136,7 +136,7 @@
             std::move(callback).Run(/*error_code=*/std::nullopt);
             break;
           default:
-            NOTREACHED();
+            NOTREACHED_IN_MIGRATION();
             std::move(callback).Run(BluetoothDevice::ERROR_UNKNOWN);
         }
         break;
@@ -157,7 +157,7 @@
         }
         break;
       case AuthBehavior::kUnspecified:
-        NOTREACHED() << "Test must set auth behavior";
+        NOTREACHED_IN_MIGRATION() << "Test must set auth behavior";
         break;
     }
   }
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.cc b/content/browser/bluetooth/web_bluetooth_service_impl.cc
index 79ee354..eca669f 100644
--- a/content/browser/bluetooth/web_bluetooth_service_impl.cc
+++ b/content/browser/bluetooth/web_bluetooth_service_impl.cc
@@ -125,7 +125,7 @@
                                  UMAGATTOperationOutcome::kNotSupported);
       return blink::mojom::WebBluetoothResult::GATT_NOT_SUPPORTED;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return blink::mojom::WebBluetoothResult::GATT_UNTRANSLATED_ERROR_CODE;
 }
 
@@ -266,10 +266,10 @@
       RecordConnectGATTOutcome(UMAConnectGATTOutcome::NON_AUTH_TIMEOUT);
       return blink::mojom::WebBluetoothResult::CONNECT_NON_AUTH_TIMEOUT;
     case BluetoothDevice::NUM_CONNECT_ERROR_CODES:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return blink::mojom::WebBluetoothResult::CONNECT_UNKNOWN_FAILURE;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return blink::mojom::WebBluetoothResult::CONNECT_UNKNOWN_FAILURE;
 }
 
@@ -300,7 +300,7 @@
     switch (outcome) {
       case CacheQueryOutcome::SUCCESS:
       case CacheQueryOutcome::BAD_RENDERER:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return blink::mojom::WebBluetoothResult::DEVICE_NO_LONGER_IN_RANGE;
       case CacheQueryOutcome::NO_DEVICE:
         return blink::mojom::WebBluetoothResult::DEVICE_NO_LONGER_IN_RANGE;
@@ -312,7 +312,7 @@
       case CacheQueryOutcome::NO_DESCRIPTOR:
         return blink::mojom::WebBluetoothResult::DESCRIPTOR_NO_LONGER_EXISTS;
     }
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return blink::mojom::WebBluetoothResult::DEVICE_NO_LONGER_IN_RANGE;
   }
 
@@ -501,7 +501,7 @@
   } else if (event == BluetoothScanningPrompt::Event::kCanceled) {
     result = blink::mojom::WebBluetoothResult::PROMPT_CANCELED;
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   client->RunCallback(std::move(result));
@@ -519,7 +519,7 @@
   } else if (event == BluetoothScanningPrompt::Event::kCanceled) {
     scanning_clients_.pop_back();
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
@@ -2497,7 +2497,7 @@
                                      std::move(callback), pairing_kind, pin);
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       std::move(callback).Run(BluetoothDelegate::PairPromptResult(
           BluetoothDelegate::PairPromptStatus::kCancelled));
       break;
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc b/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc
index adf2db2..027c510 100644
--- a/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc
+++ b/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc
@@ -172,7 +172,7 @@
                             PairPromptCallback callback,
                             PairingKind pairing_kind,
                             const std::optional<std::u16string>& pin) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   blink::WebBluetoothDeviceId GetWebBluetoothDeviceId(
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
index c3900c6..e6ead31e 100644
--- a/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
+++ b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
@@ -187,7 +187,7 @@
   // WebBluetoothCharacteristicClient implementation:
   void RemoteCharacteristicValueChanged(
       const std::vector<uint8_t>& value) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
  private:
diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc
index b0bac27..92efda7 100644
--- a/content/browser/browser_child_process_host_impl.cc
+++ b/content/browser/browser_child_process_host_impl.cc
@@ -115,7 +115,7 @@
     case PROCESS_TYPE_PPAPI_BROKER:
       return memory_instrumentation::mojom::ProcessType::PLUGIN;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return memory_instrumentation::mojom::ProcessType::OTHER;
   }
 }
@@ -529,7 +529,7 @@
       }
       case base::TERMINATION_STATUS_LAUNCH_FAILED: {
         // This is handled in OnProcessLaunchFailed.
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
       }
       case base::TERMINATION_STATUS_NORMAL_TERMINATION: {
@@ -547,7 +547,7 @@
       }
 #endif  // BUILDFLAG(IS_WIN)
       case base::TERMINATION_STATUS_MAX_ENUM: {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
       }
     }
diff --git a/content/browser/browser_context_impl.cc b/content/browser/browser_context_impl.cc
index ec54d470..958c940 100644
--- a/content/browser/browser_context_impl.cc
+++ b/content/browser/browser_context_impl.cc
@@ -71,7 +71,7 @@
       << "StoragePartitionMap is not shut down properly";
 
   if (!will_be_destroyed_soon_) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   // Verify that there are no outstanding RenderProcessHosts that reference
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index a6d1097..110cf0a 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -282,7 +282,7 @@
              (G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG)) {
     LOG(INFO) << log_domain << ": " << message;
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     LOG(DFATAL) << log_domain << ": " << message;
   }
 }
@@ -1081,7 +1081,7 @@
 void BrowserMainLoop::RunMainMessageLoop() {
 #if BUILDFLAG(IS_ANDROID)
   // Android's main message loop is the Java message loop.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 #else  // BUILDFLAG(IS_ANDROID)
   if (InterceptMainMessageLoopRun() != ProceedWithMainMessageLoopRun(true))
     return;
diff --git a/content/browser/browser_thread_impl.cc b/content/browser/browser_thread_impl.cc
index ba1f7ef..82d7d58c 100644
--- a/content/browser/browser_thread_impl.cc
+++ b/content/browser/browser_thread_impl.cc
@@ -238,7 +238,7 @@
     case IO:
       return GetIOThreadTaskRunner({});
     case ID_COUNT:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return nullptr;
   }
 }
diff --git a/content/browser/browsing_data/browsing_data_browsertest_utils.cc b/content/browser/browsing_data/browsing_data_browsertest_utils.cc
index cf2b3f4..9d78afdd 100644
--- a/content/browser/browsing_data/browsing_data_browsertest_utils.cc
+++ b/content/browser/browsing_data/browsing_data_browsertest_utils.cc
@@ -159,7 +159,7 @@
     else if (path.Extension() == FILE_PATH_LITERAL(".html"))
       response->set_content_type("text/html");
     else
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
 
     response->set_content(base::as_string_view(buffer));
   }
diff --git a/content/browser/browsing_data/browsing_data_filter_builder_impl.cc b/content/browser/browsing_data/browsing_data_filter_builder_impl.cc
index 7ae661a..cd3bd471 100644
--- a/content/browser/browsing_data/browsing_data_filter_builder_impl.cc
+++ b/content/browser/browsing_data/browsing_data_filter_builder_impl.cc
@@ -120,7 +120,7 @@
 template <typename T>
 base::RepeatingCallback<bool(const T&)> NotReachedFilter() {
   return base::BindRepeating([](const T&) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return false;
   });
 }
diff --git a/content/browser/cache_storage/cache_storage_cache.cc b/content/browser/cache_storage/cache_storage_cache.cc
index 39c42fe..6ef79d3 100644
--- a/content/browser/cache_storage/cache_storage_cache.cc
+++ b/content/browser/cache_storage/cache_storage_cache.cc
@@ -107,7 +107,7 @@
     case proto::CacheResponse::OPAQUE_REDIRECT_TYPE:
       return network::mojom::FetchResponseType::kOpaqueRedirect;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return network::mojom::FetchResponseType::kOpaque;
 }
 
@@ -127,7 +127,7 @@
     case network::mojom::FetchResponseType::kOpaqueRedirect:
       return proto::CacheResponse::OPAQUE_REDIRECT_TYPE;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return proto::CacheResponse::OPAQUE_TYPE;
 }
 
@@ -909,7 +909,7 @@
         Delete(std::move(operation), completion_callback);
         break;
       case blink::mojom::OperationType::kUndefined:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         // TODO(nhiroki): This should return "TypeError".
         // http://crbug.com/425505
         completion_callback.Run(MakeErrorStorage(
@@ -2030,7 +2030,7 @@
       break;
     }
     case INDEX_HEADERS:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   ScopedWritableEntry entry(put_context->cache_entry.release());
diff --git a/content/browser/cache_storage/cache_storage_cache_entry_handler.cc b/content/browser/cache_storage/cache_storage_cache_entry_handler.cc
index e7f9e38d..3c441c5 100644
--- a/content/browser/cache_storage/cache_storage_cache_entry_handler.cc
+++ b/content/browser/cache_storage/cache_storage_cache_entry_handler.cc
@@ -212,7 +212,7 @@
     case CacheStorageCache::INDEX_SIDE_DATA:
       return disk_cache_entry_->GetDataSize(CacheStorageCache::INDEX_SIDE_DATA);
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void CacheStorageCacheEntryHandler::DiskCacheBlobEntry::Invalidate() {
@@ -365,7 +365,7 @@
       return std::make_unique<BackgroundFetchCacheEntryHandlerImpl>(
           std::move(blob_storage_context));
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 blink::mojom::SerializedBlobPtr CacheStorageCacheEntryHandler::CreateBlob(
diff --git a/content/browser/cache_storage/cache_storage_histogram_utils.cc b/content/browser/cache_storage/cache_storage_histogram_utils.cc
index 5709b67..e290917a 100644
--- a/content/browser/cache_storage/cache_storage_histogram_utils.cc
+++ b/content/browser/cache_storage/cache_storage_histogram_utils.cc
@@ -53,7 +53,7 @@
 std::string_view OpToName(CacheStorageSchedulerOp op_type) {
   switch (op_type) {
     case CacheStorageSchedulerOp::kBackgroundSync:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "";
     case CacheStorageSchedulerOp::kClose:
       RETURN_LITERAL_STRING_PIECE("Close");
@@ -80,7 +80,7 @@
     case CacheStorageSchedulerOp::kSizeThenClose:
       RETURN_LITERAL_STRING_PIECE("SizeThenClose");
     case CacheStorageSchedulerOp::kTest:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "";
     case CacheStorageSchedulerOp::kWriteIndex:
       RETURN_LITERAL_STRING_PIECE("WriteIndex");
diff --git a/content/browser/cache_storage/cache_storage_manager.cc b/content/browser/cache_storage/cache_storage_manager.cc
index c3e5fdb..f00a791 100644
--- a/content/browser/cache_storage/cache_storage_manager.cc
+++ b/content/browser/cache_storage/cache_storage_manager.cc
@@ -799,7 +799,7 @@
           profile_path, bucket_locator,
           storage::QuotaClientType::kBackgroundFetch);
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/child_process_host_impl.cc b/content/browser/child_process_host_impl.cc
index 5006539..983b4aa 100644
--- a/content/browser/child_process_host_impl.cc
+++ b/content/browser/child_process_host_impl.cc
@@ -104,7 +104,7 @@
       child_base_name +=
           GetContentClient()->browser()->GetChildProcessSuffix(flags);
     } else {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
 
     child_path = child_path.Append(child_base_name + ".app")
diff --git a/content/browser/child_process_launcher_helper_ios.mm b/content/browser/child_process_launcher_helper_ios.mm
index fd345db5..25c1d16 100644
--- a/content/browser/child_process_launcher_helper_ios.mm
+++ b/content/browser/child_process_launcher_helper_ios.mm
@@ -387,7 +387,7 @@
                            base::MemoryMappedFile::Region* region) {
   // Not used yet (until required files are described in the service manifest on
   // iOS).
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return base::File();
 }
 
diff --git a/content/browser/child_process_launcher_helper_mac.cc b/content/browser/child_process_launcher_helper_mac.cc
index e1c5d814..fd327c2 100644
--- a/content/browser/child_process_launcher_helper_mac.cc
+++ b/content/browser/child_process_launcher_helper_mac.cc
@@ -255,7 +255,7 @@
                            base::MemoryMappedFile::Region* region) {
   // Not used yet (until required files are described in the service manifest on
   // Mac).
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return base::File();
 }
 
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
index 7822aeab..1e27fc5 100644
--- a/content/browser/child_process_security_policy_impl.cc
+++ b/content/browser/child_process_security_policy_impl.cc
@@ -589,7 +589,7 @@
               << "Cannot lock an already used process to " << lock_to_set;
         }
       } else {
-        NOTREACHED() << "Unexpected lock type.";
+        NOTREACHED_IN_MIGRATION() << "Unexpected lock type.";
       }
     }
 
@@ -809,7 +809,7 @@
   } else if (BrowserThread::CurrentlyOn(BrowserThread::IO)) {
     return resource_context_ == browser_or_resource_context.ToResourceContext();
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -873,7 +873,7 @@
   DCHECK_NE(child_id, ChildProcessHost::kInvalidUniqueID);
   base::AutoLock lock(lock_);
   if (base::Contains(security_state_, child_id)) {
-    NOTREACHED() << "Add child process at most once.";
+    NOTREACHED_IN_MIGRATION() << "Add child process at most once.";
     return;
   }
 
@@ -1431,7 +1431,7 @@
 
       default:
         // Fail safe - deny access.
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return false;
     }
   }
diff --git a/content/browser/code_cache/generated_code_cache.cc b/content/browser/code_cache/generated_code_cache.cc
index 8fc176cf..a9e025b1 100644
--- a/content/browser/code_cache/generated_code_cache.cc
+++ b/content/browser/code_cache/generated_code_cache.cc
@@ -189,7 +189,7 @@
     case GeneratedCodeCache::CodeCacheType::kWebUIJavaScript:
       return net::GENERATED_WEBUI_BYTE_CODE_CACHE;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 }  // namespace
diff --git a/content/browser/cookie_store/cookie_change_subscription.cc b/content/browser/cookie_store/cookie_change_subscription.cc
index dbe3c5b..7814e7e 100644
--- a/content/browser/cookie_store/cookie_change_subscription.cc
+++ b/content/browser/cookie_store/cookie_change_subscription.cc
@@ -34,7 +34,7 @@
     case ::network::mojom::CookieMatchType::STARTS_WITH:
       return proto::CookieMatchType::STARTS_WITH;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return proto::CookieMatchType::EQUALS;
 }
 
diff --git a/content/browser/date_time_chooser/ios/date_time_chooser_view_controller.mm b/content/browser/date_time_chooser/ios/date_time_chooser_view_controller.mm
index 5adeb25..f8884795 100644
--- a/content/browser/date_time_chooser/ios/date_time_chooser_view_controller.mm
+++ b/content/browser/date_time_chooser/ios/date_time_chooser_view_controller.mm
@@ -71,7 +71,7 @@
       style = UIDatePickerStyleInline;
       break;
     default:
-      NOTREACHED() << "Invalid type for a DateTimeChooser.";
+      NOTREACHED_IN_MIGRATION() << "Invalid type for a DateTimeChooser.";
       break;
   }
 
diff --git a/content/browser/devtools/auction_worklet_devtools_agent_host.cc b/content/browser/devtools/auction_worklet_devtools_agent_host.cc
index 0c21998..f0b8c58 100644
--- a/content/browser/devtools/auction_worklet_devtools_agent_host.cc
+++ b/content/browser/devtools/auction_worklet_devtools_agent_host.cc
@@ -127,7 +127,7 @@
 
 AuctionWorkletDevToolsAgentHostManager::
     ~AuctionWorkletDevToolsAgentHostManager() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void AuctionWorkletDevToolsAgentHostManager::GetAll(
diff --git a/content/browser/devtools/devtools_http_handler.cc b/content/browser/devtools/devtools_http_handler.cc
index 2068552e..86b1544 100644
--- a/content/browser/devtools/devtools_http_handler.cc
+++ b/content/browser/devtools/devtools_http_handler.cc
@@ -696,7 +696,7 @@
 
 void DevToolsHttpHandler::DecompressAndSendJsonProtocol(int connection_id) {
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_IOS)
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 #else
   scoped_refptr<base::RefCountedMemory> bytes =
       GetContentClient()->GetDataResourceBytes(kCcompressedProtocolJSON);
diff --git a/content/browser/devtools/devtools_instrumentation.cc b/content/browser/devtools/devtools_instrumentation.cc
index 21d7a80..606b9c2 100644
--- a/content/browser/devtools/devtools_instrumentation.cc
+++ b/content/browser/devtools/devtools_instrumentation.cc
@@ -1943,7 +1943,7 @@
     issue = BuildAttributionReportingIssue(
         info->details->attribution_reporting_issue_details);
   } else {
-    NOTREACHED() << "Unsupported type of browser-initiated issue";
+    NOTREACHED_IN_MIGRATION() << "Unsupported type of browser-initiated issue";
   }
   ReportBrowserInitiatedIssue(frame, issue.get());
 }
diff --git a/content/browser/devtools/protocol/background_service_handler.cc b/content/browser/devtools/protocol/background_service_handler.cc
index d9dcedc..703e59c 100644
--- a/content/browser/devtools/protocol/background_service_handler.cc
+++ b/content/browser/devtools/protocol/background_service_handler.cc
@@ -54,7 +54,7 @@
     case devtools::proto::BackgroundService::PERIODIC_BACKGROUND_SYNC:
       return BackgroundService::ServiceNameEnum::PeriodicBackgroundSync;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   return "invalid";
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc
index d74d1b0..66d0b26 100644
--- a/content/browser/devtools/protocol/browser_handler.cc
+++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -578,7 +578,7 @@
       state = Browser::DownloadProgress::StateEnum::Canceled;
       break;
     case download::DownloadItem::MAX_DOWNLOAD_STATE:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   frontend_->DownloadProgress(item->GetGuid(), item->GetTotalBytes(),
                               item->GetReceivedBytes(), state);
diff --git a/content/browser/devtools/protocol/devtools_network_resource_loader.cc b/content/browser/devtools/protocol/devtools_network_resource_loader.cc
index 2362ede..cd69923 100644
--- a/content/browser/devtools/protocol/devtools_network_resource_loader.cc
+++ b/content/browser/devtools/protocol/devtools_network_resource_loader.cc
@@ -92,7 +92,7 @@
 }
 
 void DevToolsNetworkResourceLoader::OnRetry(base::OnceClosure start_retry) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void DevToolsNetworkResourceLoader::DownloadAsStream() {
diff --git a/content/browser/devtools/protocol/fetch_handler.cc b/content/browser/devtools/protocol/fetch_handler.cc
index 58878248..4329ba2 100644
--- a/content/browser/devtools/protocol/fetch_handler.cc
+++ b/content/browser/devtools/protocol/fetch_handler.cc
@@ -51,7 +51,7 @@
     return DevToolsURLLoaderInterceptor::kRequest;
   if (stage == Fetch::RequestStageEnum::Response)
     return DevToolsURLLoaderInterceptor::kResponse;
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return DevToolsURLLoaderInterceptor::kRequest;
 }
 
diff --git a/content/browser/devtools/protocol/input_handler.cc b/content/browser/devtools/protocol/input_handler.cc
index 164d677..973a63d 100644
--- a/content/browser/devtools/protocol/input_handler.cc
+++ b/content/browser/devtools/protocol/input_handler.cc
@@ -1235,7 +1235,7 @@
   // Currently no DevTools target for Prerender.
   if (host_->GetLifecycleState() ==
       RenderFrameHost::LifecycleState::kPrerendering) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   // Portal cannot be focused.
   if (web_contents_->IsPortal()) {
@@ -1854,7 +1854,7 @@
     case SyntheticPointerActionParams::PointerActionType::LEAVE:
     case SyntheticPointerActionParams::PointerActionType::IDLE:
     case SyntheticPointerActionParams::PointerActionType::NOT_INITIALIZED:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   return action_params;
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc
index 00fb44c..de3720f08 100644
--- a/content/browser/devtools/protocol/network_handler.cc
+++ b/content/browser/devtools/protocol/network_handler.cc
@@ -130,10 +130,10 @@
         CT_POLICY_COMPLIANCE_DETAILS_NOT_AVAILABLE:
       return Network::CertificateTransparencyComplianceEnum::Unknown;
     case net::ct::CTPolicyCompliance::CT_POLICY_COUNT:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return Network::CertificateTransparencyComplianceEnum::Unknown;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return Network::CertificateTransparencyComplianceEnum::Unknown;
 }
 
@@ -538,7 +538,7 @@
     case net::HIGHEST:
       return Network::ResourcePriorityEnum::VeryHigh;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return Network::ResourcePriorityEnum::Medium;
 }
 
@@ -564,7 +564,7 @@
     case network::mojom::ReferrerPolicy::kStrictOriginWhenCrossOrigin:
       return Network::Request::ReferrerPolicyEnum::StrictOriginWhenCrossOrigin;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return Network::Request::ReferrerPolicyEnum::NoReferrerWhenDowngrade;
 }
 
@@ -740,7 +740,7 @@
     case SignedExchangeError::Field::kSignatureTimestamps:
       return Network::SignedExchangeErrorFieldEnum::SignatureTimestamps;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return "";
 }
 
@@ -2180,12 +2180,12 @@
     case blink::ResourceRequestBlockedReason::kConversionRequest:
       // This is actually never reached, as the conversion request
       // is marked as successful and no blocking reason is reported.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return protocol::Network::BlockedReasonEnum::Other;
     case blink::ResourceRequestBlockedReason::kSupervisedUserUrlBlocked:
       return protocol::Network::BlockedReasonEnum::Other;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return protocol::Network::BlockedReasonEnum::Other;
 }
 
@@ -2210,7 +2210,7 @@
       case network::mojom::BlockedByResponseReason::kCorpNotSameSite:
         return {protocol::Network::BlockedReasonEnum::CorpNotSameSite};
     }
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   if (status.error_code != net::ERR_BLOCKED_BY_CLIENT &&
       status.error_code != net::ERR_BLOCKED_BY_RESPONSE)
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc
index 894c0059..2e4c35e8a 100644
--- a/content/browser/devtools/protocol/page_handler.cc
+++ b/content/browser/devtools/protocol/page_handler.cc
@@ -921,7 +921,7 @@
       state = Page::DownloadProgress::StateEnum::Canceled;
       break;
     case download::DownloadItem::MAX_DOWNLOAD_STATE:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   frontend_->DownloadProgress(item->GetGuid(), item->GetTotalBytes(),
                               item->GetReceivedBytes(), state);
@@ -1704,7 +1704,7 @@
     case Reason::kBlocklistedFeatures:
       // Blocklisted features should be handled separately and be broken down
       // into sub reasons.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return Page::BackForwardCacheNotRestoredReasonEnum::Unknown;
     case Reason::kUnknown:
       return Page::BackForwardCacheNotRestoredReasonEnum::Unknown;
@@ -1813,7 +1813,7 @@
       return Page::BackForwardCacheNotRestoredReasonEnum::IndexedDBEvent;
     case WebSchedulerTrackedFeature::kDummy:
       // This is a test only reason and should never be called.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return Page::BackForwardCacheNotRestoredReasonEnum::Dummy;
     case WebSchedulerTrackedFeature::
         kJsNetworkRequestReceivedCacheControlNoStoreResource:
@@ -1855,10 +1855,10 @@
     BackForwardCache::DisabledReason reason) {
   switch (reason.source) {
     case BackForwardCache::DisabledSource::kLegacy:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return Page::BackForwardCacheNotRestoredReasonEnum::Unknown;
     case BackForwardCache::DisabledSource::kTesting:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return Page::BackForwardCacheNotRestoredReasonEnum::Unknown;
     case BackForwardCache::DisabledSource::kContent:
       switch (
@@ -2000,7 +2000,7 @@
     case Reason::kUnknown:
       return Page::BackForwardCacheNotRestoredReasonTypeEnum::SupportPending;
     case Reason::kBlocklistedFeatures:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return Page::BackForwardCacheNotRestoredReasonTypeEnum::PageSupportNeeded;
   }
 }
diff --git a/content/browser/devtools/protocol/service_worker_handler.cc b/content/browser/devtools/protocol/service_worker_handler.cc
index ed0f589..3e0dc26 100644
--- a/content/browser/devtools/protocol/service_worker_handler.cc
+++ b/content/browser/devtools/protocol/service_worker_handler.cc
@@ -55,7 +55,7 @@
     case blink::EmbeddedWorkerStatus::kStopping:
       return ServiceWorker::ServiceWorkerVersionRunningStatusEnum::Stopping;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return std::string();
 }
@@ -76,7 +76,7 @@
     case content::ServiceWorkerVersion::REDUNDANT:
       return ServiceWorker::ServiceWorkerVersionStatusEnum::Redundant;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return std::string();
 }
diff --git a/content/browser/devtools/protocol/target_handler.cc b/content/browser/devtools/protocol/target_handler.cc
index 9182bb32..6b5052d 100644
--- a/content/browser/devtools/protocol/target_handler.cc
+++ b/content/browser/devtools/protocol/target_handler.cc
@@ -150,7 +150,7 @@
     case base::TERMINATION_STATUS_MAX_ENUM:
       break;
   }
-  NOTREACHED() << "Unknown Termination Status.";
+  NOTREACHED_IN_MIGRATION() << "Unknown Termination Status.";
   return "unknown";
 }
 
diff --git a/content/browser/devtools/protocol/webauthn_handler.cc b/content/browser/devtools/protocol/webauthn_handler.cc
index d5532ac..5f1b5f1 100644
--- a/content/browser/devtools/protocol/webauthn_handler.cc
+++ b/content/browser/devtools/protocol/webauthn_handler.cc
@@ -246,7 +246,7 @@
           options->GetDefaultBackupState(/*defaultValue=*/false);
       break;
     case device::ProtocolVersion::kUnknown:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 
diff --git a/content/browser/devtools/web_contents_devtools_agent_host.cc b/content/browser/devtools/web_contents_devtools_agent_host.cc
index 6ae815e2..b7708b7 100644
--- a/content/browser/devtools/web_contents_devtools_agent_host.cc
+++ b/content/browser/devtools/web_contents_devtools_agent_host.cc
@@ -324,14 +324,14 @@
 std::optional<network::CrossOriginEmbedderPolicy>
 WebContentsDevToolsAgentHost::cross_origin_embedder_policy(
     const std::string& id) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::nullopt;
 }
 
 std::optional<network::CrossOriginOpenerPolicy>
 WebContentsDevToolsAgentHost::cross_origin_opener_policy(
     const std::string& id) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::nullopt;
 }
 
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index 7225ccca..75760ca 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -1188,7 +1188,7 @@
       break;
     case DOWNLOAD_INITIALIZATION_DEPENDENCY_NONE:
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 
diff --git a/content/browser/download/mhtml_generation_manager.cc b/content/browser/download/mhtml_generation_manager.cc
index c07b0d1..5a7a9d81 100644
--- a/content/browser/download/mhtml_generation_manager.cc
+++ b/content/browser/download/mhtml_generation_manager.cc
@@ -587,7 +587,7 @@
   // writer_.reset() does not correctly stop OnConnectionError
   // notifications for the case described in https://crbug.com/612098.
   if (is_finished_) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   is_finished_ = true;
diff --git a/content/browser/download/save_file_manager.cc b/content/browser/download/save_file_manager.cc
index c453347..53856e0 100644
--- a/content/browser/download/save_file_manager.cc
+++ b/content/browser/download/save_file_manager.cc
@@ -146,7 +146,7 @@
 
   void OnRetry(base::OnceClosure start_retry) override {
     // Retries are not enabled.
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   raw_ptr<SaveFileManager> save_file_manager_;
diff --git a/content/browser/download/save_item.cc b/content/browser/download/save_item.cc
index fb9d9df..a2a09aa5 100644
--- a/content/browser/download/save_item.cc
+++ b/content/browser/download/save_item.cc
@@ -67,7 +67,7 @@
 // complete.
 void SaveItem::Update(int64_t bytes_so_far) {
   if (state_ != IN_PROGRESS) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   UpdateSize(bytes_so_far);
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc
index 02399db..5acca609 100644
--- a/content/browser/download/save_package.cc
+++ b/content/browser/download/save_package.cc
@@ -146,10 +146,10 @@
       return "multipart/related";
     case SAVE_PAGE_TYPE_UNKNOWN:
     case SAVE_PAGE_TYPE_MAX:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 WebContents* GetWebContents(Page* page) {
@@ -330,7 +330,7 @@
   BrowserContext* browser_context =
       page_->GetMainDocument().GetBrowserContext();
   if (!browser_context) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return false;
   }
 
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc
index 3e92c96..aa539c1 100644
--- a/content/browser/fenced_frame/fenced_frame_browsertest.cc
+++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -2073,7 +2073,7 @@
         return "opaque-ads";
     }
 
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return "";
   }
 
diff --git a/content/browser/fenced_frame/fenced_frame_reporter.cc b/content/browser/fenced_frame/fenced_frame_reporter.cc
index 7f18e61e..07c7958 100644
--- a/content/browser/fenced_frame/fenced_frame_reporter.cc
+++ b/content/browser/fenced_frame/fenced_frame_reporter.cc
@@ -130,7 +130,7 @@
     case blink::FencedFrame::ReportingDestination::kDirectSeller:
       return "DirectSeller";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 std::string_view InvokingAPIAsString(
@@ -141,7 +141,7 @@
     case PrivacySandboxInvokingAPI::kSharedStorage:
       return "Shared Storage";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 std::string AutomaticBeaconTypeAsString(
diff --git a/content/browser/field_trial_synchronizer.cc b/content/browser/field_trial_synchronizer.cc
index 5bfded55..c981edc 100644
--- a/content/browser/field_trial_synchronizer.cc
+++ b/content/browser/field_trial_synchronizer.cc
@@ -152,7 +152,7 @@
 }
 
 FieldTrialSynchronizer::~FieldTrialSynchronizer() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 }  // namespace content
diff --git a/content/browser/file_system/file_system_manager_impl.cc b/content/browser/file_system/file_system_manager_impl.cc
index e72320883..bbfda89 100644
--- a/content/browser/file_system/file_system_manager_impl.cc
+++ b/content/browser/file_system/file_system_manager_impl.cc
@@ -71,7 +71,7 @@
     case blink::mojom::FileSystemType::kExternal:
       return storage::FileSystemType::kFileSystemTypeExternal;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return storage::FileSystemType::kFileSystemTypeTemporary;
 }
 
@@ -106,10 +106,10 @@
     case storage::FileSystemType::kFileSystemTypeSmbFs:
     case storage::FileSystemType::kFileSystemTypeFuseBox:
     case storage::FileSystemType::kFileSystemInternalTypeEnumEnd:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return blink::mojom::FileSystemType::kTemporary;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return blink::mojom::FileSystemType::kTemporary;
 }
 
diff --git a/content/browser/file_system/file_system_url_loader_factory_browsertest.cc b/content/browser/file_system/file_system_url_loader_factory_browsertest.cc
index c306c7b..51194c4 100644
--- a/content/browser/file_system/file_system_url_loader_factory_browsertest.cc
+++ b/content/browser/file_system/file_system_url_loader_factory_browsertest.cc
@@ -127,7 +127,7 @@
     switch (rv) {
       case MOJO_RESULT_BUSY:
       case MOJO_RESULT_INVALID_ARGUMENT:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return;
       case MOJO_RESULT_FAILED_PRECONDITION:
         std::move(quit_closure).Run();
@@ -149,7 +149,7 @@
         break;
     }
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return;
 }
 
diff --git a/content/browser/file_system_access/file_system_access_handle_base.cc b/content/browser/file_system_access/file_system_access_handle_base.cc
index d4dd2f1..b121b51 100644
--- a/content/browser/file_system_access/file_system_access_handle_base.cc
+++ b/content/browser/file_system_access/file_system_access_handle_base.cc
@@ -198,7 +198,7 @@
           writable ? GetWritePermissionStatus() : GetReadPermissionStatus());
       return;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FileSystemAccessHandleBase::DoMove(
diff --git a/content/browser/file_system_access/file_system_access_manager_impl.cc b/content/browser/file_system_access/file_system_access_manager_impl.cc
index 99bf7cc3..a450d0ce1 100644
--- a/content/browser/file_system_access/file_system_access_manager_impl.cc
+++ b/content/browser/file_system_access/file_system_access_manager_impl.cc
@@ -251,7 +251,7 @@
         kDirectoryPickerOptions:
       return ui::SelectFileDialog::SELECT_FOLDER;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return ui::SelectFileDialog::SELECT_NONE;
 }
 
@@ -892,7 +892,7 @@
       data.mutable_sandboxed()->set_bucket_id(url.bucket()->id.value());
     }
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   std::string value;
@@ -1036,7 +1036,7 @@
       break;
     }
     case FileSystemAccessHandleData::DATA_NOT_SET:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/file_system_access/file_system_chooser.cc b/content/browser/file_system_access/file_system_chooser.cc
index 6f9f4f6..963c432 100644
--- a/content/browser/file_system_access/file_system_chooser.cc
+++ b/content/browser/file_system_access/file_system_chooser.cc
@@ -157,7 +157,7 @@
     case ui::SelectFileDialog::SELECT_FOLDER:
       return type;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return ui::SelectFileDialog::SELECT_NONE;
   }
 }
diff --git a/content/browser/find_request_manager.cc b/content/browser/find_request_manager.cc
index 849b8d2..e1c67e7f 100644
--- a/content/browser/find_request_manager.cc
+++ b/content/browser/find_request_manager.cc
@@ -734,7 +734,7 @@
 
 void FindRequestManager::NotifyFindReply(int request_id, bool final_update) {
   if (request_id == kInvalidId) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
diff --git a/content/browser/gpu/browser_gpu_channel_host_factory.cc b/content/browser/gpu/browser_gpu_channel_host_factory.cc
index 13cd456..1533ca4 100644
--- a/content/browser/gpu/browser_gpu_channel_host_factory.cc
+++ b/content/browser/gpu/browser_gpu_channel_host_factory.cc
@@ -326,7 +326,7 @@
 scoped_refptr<gpu::GpuChannelHost>
 BrowserGpuChannelHostFactory::EstablishGpuChannelSync() {
 #if BUILDFLAG(IS_ANDROID)
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 #else
   EstablishGpuChannel(gpu::GpuChannelEstablishedCallback(), true);
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc
index fc77d384..4d8b2b0 100644
--- a/content/browser/gpu/gpu_internals_ui.cc
+++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -433,7 +433,7 @@
     case D3D_FEATURE_LEVEL_12_2:
       return "12_2";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "";
   }
 }
@@ -447,7 +447,7 @@
     case gpu::HasDiscreteGpu::kYes:
       return "yes";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return "";
 }
 #endif  // BUILDFLAG(IS_WIN)
@@ -607,7 +607,7 @@
     case gpu::VVCPROFILE_MAIN16_444_STILL_PICTURE:
       return "vvc profile main16 444 stillpicture";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return "";
 }
 
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index 03f3f13..0c78fc4 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -149,7 +149,7 @@
   switch (gpu_mode) {
     // TODO(rivr): Add separate histograms for the different hardware modes.
     case gpu::GpuMode::UNKNOWN:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return nullptr;
     case gpu::GpuMode::HARDWARE_GL:
     case gpu::GpuMode::HARDWARE_GRAPHITE:
@@ -224,11 +224,11 @@
     case base::TERMINATION_STATUS_OOM:
       return GpuTerminationStatus::OOM;
     case base::TERMINATION_STATUS_MAX_ENUM:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return GpuTerminationStatus::MAX_ENUM;
       // Do not add default.
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return GpuTerminationStatus::ABNORMAL_TERMINATION;
 }
 
@@ -890,7 +890,7 @@
         break;
 #endif
       case base::TERMINATION_STATUS_MAX_ENUM:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
     if (base::CommandLine::ForCurrentProcess()->HasSwitch(
diff --git a/content/browser/handwriting/handwriting_recognizer_impl_cros.cc b/content/browser/handwriting/handwriting_recognizer_impl_cros.cc
index 6cbdcb3..0a66380 100644
--- a/content/browser/handwriting/handwriting_recognizer_impl_cros.cc
+++ b/content/browser/handwriting/handwriting_recognizer_impl_cros.cc
@@ -107,7 +107,7 @@
   switch (result) {
     case LoadHandwritingModelResult::OK:
       // Handled above.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     case LoadHandwritingModelResult::FEATURE_NOT_SUPPORTED_ERROR:
     case LoadHandwritingModelResult::LANGUAGE_NOT_SUPPORTED_ERROR:
diff --git a/content/browser/hid/hid_service_unittest.cc b/content/browser/hid/hid_service_unittest.cc
index d97d2fd1..10fb5736 100644
--- a/content/browser/hid/hid_service_unittest.cc
+++ b/content/browser/hid/hid_service_unittest.cc
@@ -278,7 +278,7 @@
         }
         break;
     }
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return nullptr;
   }
 
diff --git a/content/browser/host_zoom_map_impl.cc b/content/browser/host_zoom_map_impl.cc
index 449a8da..a115b12f 100644
--- a/content/browser/host_zoom_map_impl.cc
+++ b/content/browser/host_zoom_map_impl.cc
@@ -644,10 +644,10 @@
         break;
       }
       case HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
       case HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
   }
 
diff --git a/content/browser/indexed_db/indexed_db_active_blob_registry.cc b/content/browser/indexed_db/indexed_db_active_blob_registry.cc
index 53e8fb7..55ffe88 100644
--- a/content/browser/indexed_db/indexed_db_active_blob_registry.cc
+++ b/content/browser/indexed_db/indexed_db_active_blob_registry.cc
@@ -111,13 +111,13 @@
   DCHECK(DatabaseMetaDataKey::IsValidBlobNumber(blob_number));
   auto db_pair = blob_reference_tracker_.find(database_id);
   if (db_pair == blob_reference_tracker_.end()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   SingleDBMap& blobs_in_db = db_pair->second;
   auto blob_in_db_it = blobs_in_db.find(blob_number);
   if (blob_in_db_it == blobs_in_db.end()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   bool delete_blob_in_backend = false;
diff --git a/content/browser/indexed_db/indexed_db_backing_store.cc b/content/browser/indexed_db/indexed_db_backing_store.cc
index ed2dc066..505f6bb5 100644
--- a/content/browser/indexed_db/indexed_db_backing_store.cc
+++ b/content/browser/indexed_db/indexed_db_backing_store.cc
@@ -2481,7 +2481,7 @@
   std::string_view leveldb_key_piece(object_store_data_key);
   if (!BlobEntryKey::FromObjectStoreDataKey(&leveldb_key_piece,
                                             &blob_entry_key)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return InternalInconsistencyStatus();
   }
   std::string encoded_key = blob_entry_key.Encode();
@@ -3212,7 +3212,7 @@
 
   // IndexedDBBackingStore::Cursor
   IndexedDBValue* value() override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return nullptr;
   }
   bool LoadCurrentRow(Status* s) override;
@@ -3225,7 +3225,7 @@
   }
   std::string EncodeKey(const IndexedDBKey& key,
                         const IndexedDBKey& primary_key) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return std::string();
   }
 
@@ -3320,7 +3320,7 @@
   }
   std::string EncodeKey(const IndexedDBKey& key,
                         const IndexedDBKey& primary_key) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return std::string();
   }
 
@@ -3397,7 +3397,7 @@
 
   // IndexedDBBackingStore::Cursor
   IndexedDBValue* value() override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return nullptr;
   }
   const IndexedDBKey& primary_key() const override {
@@ -3406,7 +3406,7 @@
   }
   const IndexedDBBackingStore::RecordIdentifier& record_identifier()
       const override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return record_identifier_;
   }
   bool LoadCurrentRow(Status* s) override;
@@ -3542,7 +3542,7 @@
   }
   const IndexedDBBackingStore::RecordIdentifier& record_identifier()
       const override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return record_identifier_;
   }
   bool LoadCurrentRow(Status* s) override;
@@ -3942,7 +3942,7 @@
     BlobEntryKey blob_entry_key;
     std::string_view key_piece(iter.second->object_store_data_key());
     if (!BlobEntryKey::FromObjectStoreDataKey(&key_piece, &blob_entry_key)) {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       INTERNAL_WRITE_ERROR(TRANSACTION_COMMIT_METHOD);
       transaction_ = nullptr;
       return false;
@@ -4067,7 +4067,7 @@
         std::string_view key_piece(iter.second->object_store_data_key());
         if (!BlobEntryKey::FromObjectStoreDataKey(&key_piece,
                                                   &blob_entry_key)) {
-          NOTREACHED();
+          NOTREACHED_IN_MIGRATION();
           return InternalInconsistencyStatus();
         }
         // Add the new blob-table entry for each blob to the main transaction,
@@ -4378,7 +4378,7 @@
     std::string_view leveldb_key_piece(object_store_data_key);
     if (!BlobEntryKey::FromObjectStoreDataKey(&leveldb_key_piece,
                                               &blob_entry_key)) {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return InternalInconsistencyStatus();
     }
     std::string value;
diff --git a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc
index 1cf2936..3d87af10 100644
--- a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc
@@ -95,12 +95,12 @@
   void RegisterFromDataItem(mojo::PendingReceiver<::blink::mojom::Blob> blob,
                             const std::string& uuid,
                             storage::mojom::BlobDataItemPtr item) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   void RegisterFromMemory(mojo::PendingReceiver<::blink::mojom::Blob> blob,
                           const std::string& uuid,
                           ::mojo_base::BigBuffer data) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   void WriteBlobToFile(mojo::PendingRemote<::blink::mojom::Blob> blob,
                        const base::FilePath& path,
@@ -179,7 +179,7 @@
       const std::vector<uint8_t>& bits,
       mojo::PendingReceiver<::blink::mojom::FileSystemAccessTransferToken>
           token) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void Clone(mojo::PendingReceiver<::storage::mojom::FileSystemAccessContext>
@@ -643,7 +643,7 @@
          storage::mojom::WriteBlobToFileResult error) {
         switch (result) {
           case BlobWriteResult::kFailure:
-            NOTREACHED();
+            NOTREACHED_IN_MIGRATION();
             break;
           case BlobWriteResult::kRunPhaseTwoAsync:
           case BlobWriteResult::kRunPhaseTwoAndReturnResult:
diff --git a/content/browser/indexed_db/indexed_db_browsertest.cc b/content/browser/indexed_db/indexed_db_browsertest.cc
index 65ba4056..d0bf858 100644
--- a/content/browser/indexed_db/indexed_db_browsertest.cc
+++ b/content/browser/indexed_db/indexed_db_browsertest.cc
@@ -887,7 +887,7 @@
 
   std::string file_contents;
   if (!base::ReadFileToString(resource_path, &file_contents))
-    NOTREACHED() << "could not read file " << resource_path;
+    NOTREACHED_IN_MIGRATION() << "could not read file " << resource_path;
   http_response->set_content(file_contents);
   return std::move(http_response);
 }
@@ -1009,7 +1009,7 @@
       else if (key == "callNum")
         call_num = atoi(value.c_str());
       else
-        NOTREACHED() << "Unknown param: \"" << key << "\"";
+        NOTREACHED_IN_MIGRATION() << "Unknown param: \"" << key << "\"";
     }
 
     if (fail_class == "LevelDBTransaction") {
@@ -1019,27 +1019,31 @@
       else if (fail_method == "Commit")
         failure_method = FailMethod::COMMIT;
       else
-        NOTREACHED() << "Unknown method: \"" << fail_method << "\"";
+        NOTREACHED_IN_MIGRATION()
+            << "Unknown method: \"" << fail_method << "\"";
     } else if (fail_class == "LevelDBIterator") {
       failure_class = FailClass::LEVELDB_ITERATOR;
       if (fail_method == "Seek")
         failure_method = FailMethod::SEEK;
       else
-        NOTREACHED() << "Unknown method: \"" << fail_method << "\"";
+        NOTREACHED_IN_MIGRATION()
+            << "Unknown method: \"" << fail_method << "\"";
     } else if (fail_class == "LevelDBDatabase") {
       failure_class = FailClass::LEVELDB_DATABASE;
       if (fail_method == "Write")
         failure_method = FailMethod::WRITE;
       else
-        NOTREACHED() << "Unknown method: \"" << fail_method << "\"";
+        NOTREACHED_IN_MIGRATION()
+            << "Unknown method: \"" << fail_method << "\"";
     } else if (fail_class == "LevelDBDirectTransaction") {
       failure_class = FailClass::LEVELDB_DIRECT_TRANSACTION;
       if (fail_method == "Get")
         failure_method = FailMethod::GET;
       else
-        NOTREACHED() << "Unknown method: \"" << fail_method << "\"";
+        NOTREACHED_IN_MIGRATION()
+            << "Unknown method: \"" << fail_method << "\"";
     } else {
-      NOTREACHED() << "Unknown class: \"" << fail_class << "\"";
+      NOTREACHED_IN_MIGRATION() << "Unknown class: \"" << fail_class << "\"";
     }
 
     DCHECK_GE(instance_num, 1);
diff --git a/content/browser/indexed_db/indexed_db_connection_coordinator.cc b/content/browser/indexed_db/indexed_db_connection_coordinator.cc
index 3e78176..841fa7e 100644
--- a/content/browser/indexed_db/indexed_db_connection_coordinator.cc
+++ b/content/browser/indexed_db/indexed_db_connection_coordinator.cc
@@ -688,7 +688,7 @@
 
   switch (request->state()) {
     case RequestState::kNotStarted:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return {ExecuteTaskResult::kError, leveldb::Status::OK()};
     case RequestState::kPendingNoConnections:
     case RequestState::kPendingLocks:
@@ -720,7 +720,7 @@
       return {ExecuteTaskResult::kError, status};
     }
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 size_t IndexedDBConnectionCoordinator::ActiveOpenDeleteCount() const {
diff --git a/content/browser/indexed_db/indexed_db_cursor.cc b/content/browser/indexed_db/indexed_db_cursor.cc
index 0d3a035f..188eb89 100644
--- a/content/browser/indexed_db/indexed_db_cursor.cc
+++ b/content/browser/indexed_db/indexed_db_cursor.cc
@@ -315,7 +315,7 @@
         break;
       }
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
     size_estimate += cursor_->key().size_estimate();
     size_estimate += cursor_->primary_key().size_estimate();
diff --git a/content/browser/indexed_db/indexed_db_internals_ui.cc b/content/browser/indexed_db/indexed_db_internals_ui.cc
index 6f2f0b3..b852594 100644
--- a/content/browser/indexed_db/indexed_db_internals_ui.cc
+++ b/content/browser/indexed_db/indexed_db_internals_ui.cc
@@ -281,7 +281,7 @@
       break;
     }
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding.cc b/content/browser/indexed_db/indexed_db_leveldb_coding.cc
index 7174f119..da06230 100644
--- a/content/browser/indexed_db/indexed_db_leveldb_coding.cc
+++ b/content/browser/indexed_db/indexed_db_leveldb_coding.cc
@@ -791,7 +791,7 @@
       return true;
     }
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -859,7 +859,7 @@
       slice->remove_prefix(sizeof(double));
       return true;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -891,7 +891,7 @@
       return blink::mojom::IDBKeyType::Min;
   }
 
-  NOTREACHED() << "Got invalid type " << type;
+  NOTREACHED_IN_MIGRATION() << "Got invalid type " << type;
   return blink::mojom::IDBKeyType::Invalid;
 }
 
@@ -1035,7 +1035,7 @@
     }
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return 0;
 }
 
@@ -1069,7 +1069,7 @@
                   std::string_view* b,
                   bool only_compare_index_keys,
                   bool* ok) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return 0;
 }
 
@@ -1282,7 +1282,7 @@
       break;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   *ok = false;
   return 0;
 }
@@ -1742,7 +1742,7 @@
   if (index_id_ >= kMinimumIndexId)
     return INDEX_DATA;
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return INVALID_TYPE;
 }
 
diff --git a/content/browser/indexed_db/indexed_db_reporting.cc b/content/browser/indexed_db/indexed_db_reporting.cc
index e34f0771..79c11ff 100644
--- a/content/browser/indexed_db/indexed_db_reporting.cc
+++ b/content/browser/indexed_db/indexed_db_reporting.cc
@@ -95,7 +95,7 @@
 void ReportLevelDBError(const std::string& histogram_name,
                         const leveldb::Status& s) {
   if (s.ok()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   enum {
diff --git a/content/browser/indexed_db/indexed_db_tombstone_sweeper.cc b/content/browser/indexed_db/indexed_db_tombstone_sweeper.cc
index 8ced212..c897683 100644
--- a/content/browser/indexed_db/indexed_db_tombstone_sweeper.cc
+++ b/content/browser/indexed_db/indexed_db_tombstone_sweeper.cc
@@ -161,7 +161,7 @@
         uma_size_label.append("TimeoutReached");
         break;
       case StopReason::METADATA_ERROR:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
       case StopReason::FORCE_CLOSE:
         uma_count_label.append("ForceClose");
@@ -187,11 +187,11 @@
         uma_size_label.append("Complete");
         break;
       case Status::SWEEPING:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   // Some stats are only recorded for completed runs.
diff --git a/content/browser/indexed_db/indexed_db_transaction.cc b/content/browser/indexed_db/indexed_db_transaction.cc
index 5d9cf2d..36f7026 100644
--- a/content/browser/indexed_db/indexed_db_transaction.cc
+++ b/content/browser/indexed_db/indexed_db_transaction.cc
@@ -49,7 +49,7 @@
     case storage::mojom::WriteBlobToFileResult::kSuccess:
       return "Success";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return "";
 }
 
@@ -86,7 +86,7 @@
     case blink::mojom::IDBException::kTimeoutError:
       return UmaIDBExceptionTimeoutError;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return UmaIDBExceptionUnknownError;
 }
@@ -560,7 +560,7 @@
       return CommitPhaseTwo();
     }
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 leveldb::Status IndexedDBTransaction::DoPendingCommit() {
@@ -679,7 +679,7 @@
             size_kb);
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
 
     committed = s.ok();
diff --git a/content/browser/interest_group/auction_process_manager_unittest.cc b/content/browser/interest_group/auction_process_manager_unittest.cc
index 5d053b4..8a59e6ba 100644
--- a/content/browser/interest_group/auction_process_manager_unittest.cc
+++ b/content/browser/interest_group/auction_process_manager_unittest.cc
@@ -77,7 +77,7 @@
       auction_worklet::mojom::AuctionWorkletPermissionsPolicyStatePtr
           permissions_policy_state,
       std::optional<uint16_t> experiment_id) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void LoadSellerWorklet(
@@ -95,7 +95,7 @@
       auction_worklet::mojom::AuctionWorkletPermissionsPolicyStatePtr
           permissions_policy_state,
       std::optional<uint16_t> experiment_id) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   size_t NumReceivers() {
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc
index 968819d..ade6d14 100644
--- a/content/browser/interest_group/auction_runner_unittest.cc
+++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -3134,7 +3134,7 @@
     } else if (bidder1_seller == kComponentSeller2) {
       component2_buyers.push_back(kBidder1);
     } else {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
 
     if (bidder2_seller == kComponentSeller1) {
@@ -3142,7 +3142,7 @@
     } else if (bidder2_seller == kComponentSeller2) {
       component2_buyers.push_back(kBidder2);
     } else {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
 
     component_auctions_.emplace_back(CreateAuctionConfig(
@@ -18224,7 +18224,7 @@
                   /*highest_scoring_other_bid=*/ModeBid(3), ModeCurrency(),
                   /*made_highest_scoring_other_bid=*/false)));
     } else {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
   }
 }
@@ -18477,7 +18477,7 @@
                   /*highest_scoring_other_bid=*/ModeBid(2), ModeCurrency(),
                   /*made_highest_scoring_other_bid=*/true)));
     } else {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
   }
 }
@@ -18720,7 +18720,7 @@
                   /*highest_scoring_other_bid=*/ModeBid(2), ModeCurrency(),
                   /*made_highest_scoring_other_bid=*/false)));
     } else {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
   }
 }
@@ -21848,7 +21848,7 @@
                     "commonid1/true"));
             break;
           default:
-            NOTREACHED();
+            NOTREACHED_IN_MIGRATION();
         }
       }
     }
diff --git a/content/browser/interest_group/auction_url_loader_factory_proxy.cc b/content/browser/interest_group/auction_url_loader_factory_proxy.cc
index 875c368..c0d6fcf 100644
--- a/content/browser/interest_group/auction_url_loader_factory_proxy.cc
+++ b/content/browser/interest_group/auction_url_loader_factory_proxy.cc
@@ -337,7 +337,7 @@
 
 void AuctionURLLoaderFactoryProxy::Clone(
     mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 AuctionNetworkEventsProxy::AuctionNetworkEventsProxy(
diff --git a/content/browser/interest_group/auction_worklet_manager_unittest.cc b/content/browser/interest_group/auction_worklet_manager_unittest.cc
index 9fa8cc9d..60018ea 100644
--- a/content/browser/interest_group/auction_worklet_manager_unittest.cc
+++ b/content/browser/interest_group/auction_worklet_manager_unittest.cc
@@ -199,7 +199,7 @@
       mojo::PendingAssociatedReceiver<
           auction_worklet::mojom::GenerateBidFinalizer> bid_finalizer)
       override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void SendPendingSignalsRequests() override {
@@ -242,7 +242,7 @@
       std::optional<uint32_t> bidding_signals_data_version,
       uint64_t trace_id,
       ReportWinCallback report_win_callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void ConnectDevToolsAgent(
@@ -370,7 +370,7 @@
       uint64_t trace_id,
       mojo::PendingRemote<auction_worklet::mojom::ScoreAdClient>
           score_ad_client) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void SendPendingSignalsRequests() override {
@@ -407,7 +407,7 @@
       std::optional<uint32_t> browser_signal_data_version,
       uint64_t trace_id,
       ReportResultCallback report_result_callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void ConnectDevToolsAgent(
diff --git a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
index 4be6112..3c8cbfb1 100644
--- a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
+++ b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
@@ -410,17 +410,17 @@
   // classes don't make network requests, but a real AuctionWorkletManager is
   // used, which expects most of these methods to return non-null objects.
   network::mojom::URLLoaderFactory* GetFrameURLLoaderFactory() override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return nullptr;
   }
   network::mojom::URLLoaderFactory* GetTrustedURLLoaderFactory() override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return nullptr;
   }
   void PreconnectSocket(
       const GURL& url,
       const net::NetworkAnonymizationKey& network_anonymization_key) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   RenderFrameHostImpl* GetFrame() override {
     return static_cast<RenderFrameHostImpl*>(main_rfh());
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc
index 5715f51..4563c6a 100644
--- a/content/browser/interest_group/interest_group_browsertest.cc
+++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -644,7 +644,8 @@
     response->set_content(
         R"({"joinAdInterestGroup" : true, "leaveAdInterestGroup" : true})");
   } else {
-    NOTREACHED() << "Unexpected host_header: " << host_header->second;
+    NOTREACHED_IN_MIGRATION()
+        << "Unexpected host_header: " << host_header->second;
   }
   return response;
 }
diff --git a/content/browser/interest_group/interest_group_storage.cc b/content/browser/interest_group/interest_group_storage.cc
index a86417b6..f283aa9 100644
--- a/content/browser/interest_group/interest_group_storage.cc
+++ b/content/browser/interest_group/interest_group_storage.cc
@@ -4832,8 +4832,8 @@
     return transaction.Commit();
   }
 
-  NOTREACHED();  // Only versions 6 up to the current version should have passed
-                 // RazeIfIncompatible.
+  NOTREACHED_IN_MIGRATION();  // Only versions 6 up to the current version
+                              // should have passed RazeIfIncompatible.
   return false;
 }
 
@@ -4971,7 +4971,8 @@
     bool parse_failure) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!EnsureDBInitialized()) {
-    NOTREACHED();  // We already fetched interest groups to update...
+    NOTREACHED_IN_MIGRATION();  // We already fetched interest groups to
+                                // update...
     return;
   }
 
diff --git a/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc b/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc
index c510870..ba0d27d4 100644
--- a/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc
+++ b/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc
@@ -73,7 +73,7 @@
     base::Time delete_end,
     StoragePartition::StorageKeyMatcherFunction filter,
     base::OnceClosure done) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 bool TestInterestGroupPrivateAggregationManager::IsDebugModeAllowed(
diff --git a/content/browser/loader/cached_navigation_url_loader.cc b/content/browser/loader/cached_navigation_url_loader.cc
index 026c012..41c96a5 100644
--- a/content/browser/loader/cached_navigation_url_loader.cc
+++ b/content/browser/loader/cached_navigation_url_loader.cc
@@ -57,7 +57,7 @@
   // Respond with a fake response.
   switch (loader_type_) {
     case LoaderType::kRegular:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     case LoaderType::kNoopForBackForwardCache:
       // We use PostTask here to mimic the flow of a normal navigation.
@@ -86,7 +86,7 @@
     const std::vector<std::string>& removed_headers,
     const net::HttpRequestHeaders& modified_headers,
     const net::HttpRequestHeaders& modified_cors_exempt_headers) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 bool CachedNavigationURLLoader::SetNavigationTimeout(base::TimeDelta timeout) {
diff --git a/content/browser/loader/cross_origin_read_blocking_checker.cc b/content/browser/loader/cross_origin_read_blocking_checker.cc
index 4ad0ee7..ea67c82 100644
--- a/content/browser/loader/cross_origin_read_blocking_checker.cc
+++ b/content/browser/loader/cross_origin_read_blocking_checker.cc
@@ -128,7 +128,7 @@
                                     base::Unretained(blob_io_state_.get())));
       return;
   }
-  NOTREACHED();  // Unrecognized `decision` value?
+  NOTREACHED_IN_MIGRATION();  // Unrecognized `decision` value?
 }
 
 CrossOriginReadBlockingChecker::~CrossOriginReadBlockingChecker() {
@@ -188,12 +188,12 @@
     case network::orb::ResponseAnalyzer::Decision::kSniffMore:
       // This should be impossible after going through
       // HandleEndOfSniffableResponseBody above.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   // Fall back to blocking after encountering an unexpected or unrecognized
   // `orb_decision` in the `switch` statement above.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   OnBlocked();
 }
 
diff --git a/content/browser/loader/navigation_early_hints_manager.cc b/content/browser/loader/navigation_early_hints_manager.cc
index a518d0c..51cd8408 100644
--- a/content/browser/loader/navigation_early_hints_manager.cc
+++ b/content/browser/loader/navigation_early_hints_manager.cc
@@ -97,7 +97,7 @@
     case network::mojom::LinkAsAttribute::kFetch:
       return network::mojom::CSPDirectiveName::ConnectSrc;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return network::mojom::CSPDirectiveName::Unknown;
 }
 
@@ -174,7 +174,7 @@
     case network::mojom::CrossOriginAttribute::kUseCredentials:
       return network::mojom::RequestMode::kCors;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return network::mojom::RequestMode::kSameOrigin;
 }
 
@@ -194,7 +194,7 @@
     case network::mojom::CrossOriginAttribute::kAnonymous:
       return network::mojom::CredentialsMode::kSameOrigin;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return network::mojom::CredentialsMode::kOmit;
 }
 
@@ -324,7 +324,7 @@
   void OnUploadProgress(int64_t current_position,
                         int64_t total_size,
                         OnUploadProgressCallback callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override {
     network::RecordOnTransferSizeUpdatedUMA(
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index eef19518..4771952 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -455,9 +455,10 @@
                      rhs->no_vary_search_with_parse_error));
   CHECK(mojo::Equals(adjusted_lhs->observe_browsing_topics,
                      rhs->observe_browsing_topics));
-  NOTREACHED() << "The parsed headers don't match, but we don't know which "
-                  "field does not match. Please add a DCHECK before this one "
-                  "checking for the missing field.";
+  NOTREACHED_IN_MIGRATION()
+      << "The parsed headers don't match, but we don't know which "
+         "field does not match. Please add a DCHECK before this one "
+         "checking for the missing field.";
 }
 #endif
 
@@ -1141,7 +1142,7 @@
     int64_t current_position,
     int64_t total_size,
     OnUploadProgressCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void NavigationURLLoaderImpl::OnTransferSizeUpdated(
diff --git a/content/browser/loader/object_navigation_fallback_body_loader.cc b/content/browser/loader/object_navigation_fallback_body_loader.cc
index 5c72009..6c29283 100644
--- a/content/browser/loader/object_navigation_fallback_body_loader.cc
+++ b/content/browser/loader/object_navigation_fallback_body_loader.cc
@@ -91,7 +91,7 @@
 void ObjectNavigationFallbackBodyLoader::OnReceiveEarlyHints(
     network::mojom::EarlyHintsPtr) {
   // Should have already happened.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ObjectNavigationFallbackBodyLoader::OnReceiveResponse(
@@ -99,14 +99,14 @@
     mojo::ScopedDataPipeConsumerHandle body,
     std::optional<mojo_base::BigBuffer> cached_metadata) {
   // Should have already happened.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ObjectNavigationFallbackBodyLoader::OnReceiveRedirect(
     const net::RedirectInfo&,
     network::mojom::URLResponseHeadPtr) {
   // Should have already happened.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ObjectNavigationFallbackBodyLoader::OnUploadProgress(
@@ -114,7 +114,7 @@
     int64_t total_size,
     OnUploadProgressCallback) {
   // Should have already happened.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ObjectNavigationFallbackBodyLoader::OnTransferSizeUpdated(
diff --git a/content/browser/media/audio_output_stream_broker.cc b/content/browser/media/audio_output_stream_broker.cc
index 34c096d..b72a21b2 100644
--- a/content/browser/media/audio_output_stream_broker.cc
+++ b/content/browser/media/audio_output_stream_broker.cc
@@ -175,7 +175,7 @@
   TRACE_EVENT_NESTABLE_ASYNC_INSTANT1("audio", "ObserverBindingLost", this,
                                       "reset reason", reason);
   if (reason > static_cast<uint32_t>(DisconnectReason::kMaxValue))
-    NOTREACHED() << "Invalid reason: " << reason;
+    NOTREACHED_IN_MIGRATION() << "Invalid reason: " << reason;
 
   DisconnectReason reason_enum = static_cast<DisconnectReason>(reason);
 
diff --git a/content/browser/media/capture/frame_sink_video_capture_device.cc b/content/browser/media/capture/frame_sink_video_capture_device.cc
index 7a6f7fb4..11180a87 100644
--- a/content/browser/media/capture/frame_sink_video_capture_device.cc
+++ b/content/browser/media/capture/frame_sink_video_capture_device.cc
@@ -355,7 +355,7 @@
   // FrameSinkVideoCaptureDevice does not use a
   // VideoCaptureDevice::Client. Instead, it provides frames to a
   // VideoFrameReceiver directly.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FrameSinkVideoCaptureDevice::RestartCapturerIfNeeded() {
diff --git a/content/browser/media/capture/screen_capture_kit_device_mac.mm b/content/browser/media/capture/screen_capture_kit_device_mac.mm
index fd1dc75..2d05b1c4 100644
--- a/content/browser/media/capture/screen_capture_kit_device_mac.mm
+++ b/content/browser/media/capture/screen_capture_kit_device_mac.mm
@@ -195,7 +195,7 @@
         }
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
     if (!filter) {
diff --git a/content/browser/media/capture/screen_capture_kit_fullscreen_module.mm b/content/browser/media/capture/screen_capture_kit_fullscreen_module.mm
index b2de0633..844c7339 100644
--- a/content/browser/media/capture/screen_capture_kit_fullscreen_module.mm
+++ b/content/browser/media/capture/screen_capture_kit_fullscreen_module.mm
@@ -278,7 +278,7 @@
         case Mode::kLibreOffice:
         // TODO(crbug.com/40233195): Implement support for LibreOffice.
         case Mode::kUnsupported:
-          NOTREACHED();
+          NOTREACHED_IN_MIGRATION();
       }
     }
   }
diff --git a/content/browser/media/capture/screen_capture_kit_fullscreen_module_unittest.mm b/content/browser/media/capture/screen_capture_kit_fullscreen_module_unittest.mm
index 78921ea..b229b07 100644
--- a/content/browser/media/capture/screen_capture_kit_fullscreen_module_unittest.mm
+++ b/content/browser/media/capture/screen_capture_kit_fullscreen_module_unittest.mm
@@ -143,7 +143,7 @@
       case Mode::kSlideshow:
         return kFrameSlideshow.ToCGRect();
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
   }
 
diff --git a/content/browser/media/capture/video_capture_device_proxy_lacros.cc b/content/browser/media/capture/video_capture_device_proxy_lacros.cc
index 3fca9dad..119649ea 100644
--- a/content/browser/media/capture/video_capture_device_proxy_lacros.cc
+++ b/content/browser/media/capture/video_capture_device_proxy_lacros.cc
@@ -236,7 +236,7 @@
   // VideoCaptureDeviceProxyLacros does not use a
   // VideoCaptureDevice::Client. Instead, it provides frames to a
   // VideoFrameReceiver directly.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 }  // namespace content
diff --git a/content/browser/media/desktop_media_window_registry_aura.cc b/content/browser/media/desktop_media_window_registry_aura.cc
index 7bacaa7..20e28f3 100644
--- a/content/browser/media/desktop_media_window_registry_aura.cc
+++ b/content/browser/media/desktop_media_window_registry_aura.cc
@@ -52,7 +52,7 @@
         return;
       }
     }
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   base::IDMap<aura::Window*> registered_windows_;
diff --git a/content/browser/media/media_devices_util.cc b/content/browser/media/media_devices_util.cc
index 652afe7..26172bb 100644
--- a/content/browser/media/media_devices_util.cc
+++ b/content/browser/media/media_devices_util.cc
@@ -89,7 +89,7 @@
     case MediaStreamType::DEVICE_VIDEO_CAPTURE:
       return MediaDeviceType::kMediaVideoInput;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   return MediaDeviceType::kNumMediaDeviceTypes;
diff --git a/content/browser/media/media_interface_proxy.cc b/content/browser/media/media_interface_proxy.cc
index 3ca2b17..8f33767 100644
--- a/content/browser/media/media_interface_proxy.cc
+++ b/content/browser/media/media_interface_proxy.cc
@@ -602,15 +602,15 @@
   auto cdm_info = CdmRegistryImpl::GetInstance()->GetCdmInfo(
       key_system, CdmInfo::Robustness::kSoftwareSecure);
   if (!cdm_info) {
-    NOTREACHED() << "No valid CdmInfo for " << key_system;
+    NOTREACHED_IN_MIGRATION() << "No valid CdmInfo for " << key_system;
     return nullptr;
   }
   if (cdm_info->path.empty()) {
-    NOTREACHED() << "CDM path for " << key_system << " is empty";
+    NOTREACHED_IN_MIGRATION() << "CDM path for " << key_system << " is empty";
     return nullptr;
   }
   if (!IsValidCdmDisplayName(cdm_info->name)) {
-    NOTREACHED() << "Invalid CDM display name " << cdm_info->name;
+    NOTREACHED_IN_MIGRATION() << "Invalid CDM display name " << cdm_info->name;
     return nullptr;
   }
 
diff --git a/content/browser/media/media_internals_audio_focus_helper.cc b/content/browser/media/media_internals_audio_focus_helper.cc
index 82ea18c..ebddd745 100644
--- a/content/browser/media/media_internals_audio_focus_helper.cc
+++ b/content/browser/media/media_internals_audio_focus_helper.cc
@@ -308,7 +308,7 @@
               result.append(kMediaSessionHasAudioVideo);
               break;
             case media_session::mojom::MediaAudioVideoState::kDeprecatedUnknown:
-              NOTREACHED();
+              NOTREACHED_IN_MIGRATION();
               break;
           }
         });
diff --git a/content/browser/media/media_keys_listener_manager_impl.cc b/content/browser/media/media_keys_listener_manager_impl.cc
index 3302474..4dc2261 100644
--- a/content/browser/media/media_keys_listener_manager_impl.cc
+++ b/content/browser/media/media_keys_listener_manager_impl.cc
@@ -406,7 +406,7 @@
           browser_system_media_controls_->SetIsStopEnabled(should_enable);
           break;
         default:
-          NOTREACHED();
+          NOTREACHED_IN_MIGRATION();
       }
     }
   }
@@ -448,7 +448,7 @@
           smc->SetIsStopEnabled(should_enable);
           break;
         default:
-          NOTREACHED();
+          NOTREACHED_IN_MIGRATION();
       }
     }
   }
diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc
index 88f2f28..062fd9a 100644
--- a/content/browser/media/session/media_session_impl.cc
+++ b/content/browser/media/session/media_session_impl.cc
@@ -931,7 +931,7 @@
               MediaSessionSuspendedSource::kSystemPermanent);
           break;
         case State::ACTIVE:
-          NOTREACHED();
+          NOTREACHED_IN_MIGRATION();
           break;
       }
       break;
@@ -1200,7 +1200,7 @@
       case AudioFocusType::kAmbient:
       case AudioFocusType::kGainTransient:
         // MediaSessionImpl does not use |kGainTransient| or |kAmbient|.
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
       case AudioFocusType::kGainTransientMayDuck:
         // The focus request failed, we should suspend any players that have
diff --git a/content/browser/media/session/pepper_player_delegate.cc b/content/browser/media/session/pepper_player_delegate.cc
index 78f243a..558b2a4 100644
--- a/content/browser/media/session/pepper_player_delegate.cc
+++ b/content/browser/media/session/pepper_player_delegate.cc
@@ -78,7 +78,7 @@
 void PepperPlayerDelegate::OnSetAudioSinkId(int player_id,
                                             const std::string& raw_device_id) {
   // Pepper player cannot change audio sinks. Do nothing.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void PepperPlayerDelegate::OnSetMute(int player_id, bool mute) {}
diff --git a/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc b/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc
index c6bcaff..1d99957 100644
--- a/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc
+++ b/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc
@@ -154,7 +154,7 @@
       break;
     case GestureType::kCancel:
     case GestureType::kInvoke:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   return scrim;
diff --git a/content/browser/navigation_transitions/back_forward_transition_animator.cc b/content/browser/navigation_transitions/back_forward_transition_animator.cc
index eed7e44..02971ac9 100644
--- a/content/browser/navigation_transitions/back_forward_transition_animator.cc
+++ b/content/browser/navigation_transitions/back_forward_transition_animator.cc
@@ -353,12 +353,12 @@
       break;
     }
     case State::kWaitingForBeforeUnloadResponse:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "The start of the second navigation will always cancel the "
              "navigation that's waiting for the renderer's BeforeUnload ack.";
       break;
     case State::kAnimationFinished:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "No navigations can commit during the animator's destruction "
              "because the destruction is atomic.";
       break;
@@ -516,7 +516,7 @@
       case State::kWaitingForBeforeUnloadResponse:
       case State::kWaitingForNewRendererToDraw:
       case State::kAnimationFinished:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
   } else {
@@ -621,7 +621,7 @@
       return;
     }
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void BackForwardTransitionAnimator::OnCancelAnimationDisplayed() {
@@ -811,7 +811,7 @@
         // `OnDidFinishNavigation()` has already notified the physics model to
         // switch to the cancel spring.
       } else {
-        NOTREACHED() << ToString(navigation_state_);
+        NOTREACHED_IN_MIGRATION() << ToString(navigation_state_);
       }
       CHECK(animation_manager_->web_contents_view_android()
                 ->GetTopLevelNativeWindow());
diff --git a/content/browser/navigation_transitions/physics_model.cc b/content/browser/navigation_transitions/physics_model.cc
index 5c146d3..7cf83f87 100644
--- a/content/browser/navigation_transitions/physics_model.cc
+++ b/content/browser/navigation_transitions/physics_model.cc
@@ -437,23 +437,23 @@
     case NavigationState::kNotStarted:
     case NavigationState::kNeverStarted: {
       // A navigation needs to start first.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     }
     case NavigationState::kBeforeUnloadDispatched: {
       // Not reachable because the browser is waiting for the ack from the
       // renderer.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     }
     case NavigationState::kCancelled: {
       // A cancelled navigation should never commit.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     }
     case NavigationState::kCommitted: {
       // A navigation can only commit (finish) once.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     }
   }
diff --git a/content/browser/net_info_browsertest.cc b/content/browser/net_info_browsertest.cc
index 930b7cdb..2585875 100644
--- a/content/browser/net_info_browsertest.cc
+++ b/content/browser/net_info_browsertest.cc
@@ -439,7 +439,8 @@
       return;
     }
   }
-  NOTREACHED() << "Noise not added to the network quality estimates";
+  NOTREACHED_IN_MIGRATION()
+      << "Noise not added to the network quality estimates";
 }
 
 // Make sure the minor changes (<10%) in the network quality are not notified.
diff --git a/content/browser/network/trust_token_origin_trial_browsertest.cc b/content/browser/network/trust_token_origin_trial_browsertest.cc
index 3592a6d..b986421 100644
--- a/content/browser/network/trust_token_origin_trial_browsertest.cc
+++ b/content/browser/network/trust_token_origin_trial_browsertest.cc
@@ -117,7 +117,7 @@
     case TrialType::kOnlyIssuanceRequiresOriginTrial:
       return "OnlyIssuanceNeedsTrial";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "";
   }
 }
@@ -270,7 +270,7 @@
     case Op::kRedemption:
       return "Redemption";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "";
   }
 }
@@ -389,7 +389,7 @@
       EXPECT_FALSE(trust_token_request_->trust_token_params);
       break;
     case Outcome::kFailure:
-      NOTREACHED();  // Handled earlier.
+      NOTREACHED_IN_MIGRATION();  // Handled earlier.
   }
 }
 
diff --git a/content/browser/network_service_browsertest.cc b/content/browser/network_service_browsertest.cc
index ea5ae70..26b715ef 100644
--- a/content/browser/network_service_browsertest.cc
+++ b/content/browser/network_service_browsertest.cc
@@ -543,7 +543,7 @@
     }
     void Clone(mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver)
         override {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
 
     bool has_received_preflight() const { return has_received_preflight_; }
diff --git a/content/browser/notifications/notification_database_conversions.cc b/content/browser/notifications/notification_database_conversions.cc
index ea202d67..15e256d 100644
--- a/content/browser/notifications/notification_database_conversions.cc
+++ b/content/browser/notifications/notification_database_conversions.cc
@@ -158,7 +158,7 @@
         action->type = blink::mojom::NotificationActionType::TEXT;
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
 
     action->action = payload_action.action();
@@ -249,7 +249,7 @@
             NotificationDatabaseDataProto::NotificationAction::TEXT);
         break;
       default:
-        NOTREACHED() << "Unknown action type: " << action->type;
+        NOTREACHED_IN_MIGRATION() << "Unknown action type: " << action->type;
     }
 
     payload_action->set_action(action->action);
diff --git a/content/browser/notifications/notification_event_dispatcher_impl.cc b/content/browser/notifications/notification_event_dispatcher_impl.cc
index bc0202a..38b0ae0 100644
--- a/content/browser/notifications/notification_event_dispatcher_impl.cc
+++ b/content/browser/notifications/notification_event_dispatcher_impl.cc
@@ -82,7 +82,7 @@
     case blink::ServiceWorkerStatusCode::kErrorStorageDataCorrupted:
       return PersistentNotificationStatus::kServiceWorkerError;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return PersistentNotificationStatus::kServiceWorkerError;
 }
 
@@ -152,7 +152,7 @@
       status = PersistentNotificationStatus::kServiceWorkerError;
       break;
     case blink::ServiceWorkerStatusCode::kOk:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 
@@ -459,7 +459,7 @@
         return true;
       }
       case RenderProcessHost::NotificationServiceCreatorType::kServiceWorker: {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return false;
       }
     }
diff --git a/content/browser/payments/payment_app_content_unittest_base.cc b/content/browser/payments/payment_app_content_unittest_base.cc
index 881e17f..378434f 100644
--- a/content/browser/payments/payment_app_content_unittest_base.cc
+++ b/content/browser/payments/payment_app_content_unittest_base.cc
@@ -254,7 +254,7 @@
     }
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
diff --git a/content/browser/permissions/permission_service_impl.cc b/content/browser/permissions/permission_service_impl.cc
index c44febe..3ea07eb 100644
--- a/content/browser/permissions/permission_service_impl.cc
+++ b/content/browser/permissions/permission_service_impl.cc
@@ -62,7 +62,7 @@
       return EmbeddedPermissionControlResult::kDismissed;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return EmbeddedPermissionControlResult::kNotSupported;
 }
 
diff --git a/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.cc b/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.cc
index 1ec46a2..f23dabe79 100644
--- a/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.cc
+++ b/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.cc
@@ -114,7 +114,7 @@
 void DocumentPictureInPictureWindowControllerImpl::OnWindowDestroyed(
     bool should_pause_video) {
   // We instead watch for the WebContents.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 WebContents* DocumentPictureInPictureWindowControllerImpl::GetWebContents() {
@@ -255,7 +255,7 @@
   // should only ever be one PiP window and the duplicated window bypasses some
   // of the controller logic here. This is a regression check for
   // https://crbug.com/1413919.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 }  // namespace content
diff --git a/content/browser/ppapi_plugin_process_host.cc b/content/browser/ppapi_plugin_process_host.cc
index b046a430..712ceaf 100644
--- a/content/browser/ppapi_plugin_process_host.cc
+++ b/content/browser/ppapi_plugin_process_host.cc
@@ -99,7 +99,7 @@
   if (plugin_host->Init(info))
     return plugin_host;
 
-  NOTREACHED();  // Init is not expected to fail.
+  NOTREACHED_IN_MIGRATION();  // Init is not expected to fail.
   return nullptr;
 }
 
diff --git a/content/browser/preloading/prefetch/prefetch_canary_checker.cc b/content/browser/preloading/prefetch/prefetch_canary_checker.cc
index 9d39008..23d78cb9 100644
--- a/content/browser/preloading/prefetch/prefetch_canary_checker.cc
+++ b/content/browser/preloading/prefetch/prefetch_canary_checker.cc
@@ -73,10 +73,10 @@
     case PrefetchCanaryChecker::CheckType::kDNS:
       return "DNS";
     default:
-      NOTREACHED() << static_cast<int>(name);
+      NOTREACHED_IN_MIGRATION() << static_cast<int>(name);
       return std::string();
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::string();
 }
 
diff --git a/content/browser/preloading/prefetch/prefetch_container.cc b/content/browser/preloading/prefetch/prefetch_container.cc
index eb1f8591..d1a67bd 100644
--- a/content/browser/preloading/prefetch/prefetch_container.cc
+++ b/content/browser/preloading/prefetch/prefetch_container.cc
@@ -104,7 +104,7 @@
     case PreloadingEligibility::kEligible:
     default:
       // Other ineligible cases are not used in `PrefetchService`.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return PrefetchStatus::kPrefetchIneligiblePreloadingDisabled;
   }
 }
@@ -670,7 +670,7 @@
 void PrefetchContainer::SetLoadState(LoadState new_load_state) {
   switch (new_load_state) {
     case LoadState::kNotStarted:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
 
     case LoadState::kEligible:
diff --git a/content/browser/preloading/prefetch/prefetch_data_pipe_tee.cc b/content/browser/preloading/prefetch/prefetch_data_pipe_tee.cc
index 2058e66..e3e8893 100644
--- a/content/browser/preloading/prefetch/prefetch_data_pipe_tee.cc
+++ b/content/browser/preloading/prefetch/prefetch_data_pipe_tee.cc
@@ -153,7 +153,7 @@
         break;
       case State::kSizeExceededNoTarget:
       case State::kLoaded:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
     source_->EndReadData(num_bytes);
@@ -171,7 +171,7 @@
         break;
       case State::kSizeExceededNoTarget:
       case State::kLoaded:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
   } else if (rv != MOJO_RESULT_SHOULD_WAIT) {
@@ -250,7 +250,7 @@
       }
       break;
     case State::kSizeExceededNoTarget:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 }
diff --git a/content/browser/preloading/prefetch/prefetch_probe_result.cc b/content/browser/preloading/prefetch/prefetch_probe_result.cc
index 129089a..ea1ea37 100644
--- a/content/browser/preloading/prefetch/prefetch_probe_result.cc
+++ b/content/browser/preloading/prefetch/prefetch_probe_result.cc
@@ -18,7 +18,7 @@
     case PrefetchProbeResult::kDNSProbeFailure:
       return false;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
diff --git a/content/browser/preloading/prefetch/prefetch_response_reader.cc b/content/browser/preloading/prefetch/prefetch_response_reader.cc
index a5d5e25..e6abaa5 100644
--- a/content/browser/preloading/prefetch/prefetch_response_reader.cc
+++ b/content/browser/preloading/prefetch/prefetch_response_reader.cc
@@ -228,7 +228,7 @@
     case LoadState::kFailedRedirect:
       // `CreateRequestHandler()` shouldn't be called for these non-servable
       // states.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 
@@ -483,7 +483,7 @@
   // a redirect, then it will be interrupted before |FollowRedirect| is called,
   // and instead interceptors are given a chance to intercept the navigation to
   // the redirect.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void PrefetchResponseReader::SetPriority(net::RequestPriority priority,
diff --git a/content/browser/preloading/prefetch/prefetch_service.cc b/content/browser/preloading/prefetch/prefetch_service.cc
index 7106b13..ca0b58c 100644
--- a/content/browser/preloading/prefetch/prefetch_service.cc
+++ b/content/browser/preloading/prefetch/prefetch_service.cc
@@ -110,7 +110,7 @@
     case PreloadingEligibility::kEligible:
     default:
       // Other ineligible cases are not used in `PrefetchService`.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return false;
   }
 }
diff --git a/content/browser/preloading/prefetch/prefetch_streaming_url_loader.cc b/content/browser/preloading/prefetch/prefetch_streaming_url_loader.cc
index 6d75dfb..56b72d30 100644
--- a/content/browser/preloading/prefetch/prefetch_streaming_url_loader.cc
+++ b/content/browser/preloading/prefetch/prefetch_streaming_url_loader.cc
@@ -225,7 +225,7 @@
     int64_t total_size,
     OnUploadProgressCallback callback) {
   // Only handle GETs.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void PrefetchStreamingURLLoader::OnTransferSizeUpdated(
diff --git a/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc b/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc
index 1c42adc..8bd208a 100644
--- a/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc
+++ b/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc
@@ -242,7 +242,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       std::get<0>(GetParam()) ? on_head_received_loop.QuitClosure()
                               : base::OnceClosure(),
@@ -352,7 +352,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       std::get<0>(GetParam()) ? on_head_received_loop.QuitClosure()
                               : base::OnceClosure(),
@@ -475,7 +475,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       std::get<0>(GetParam()) ? on_head_received_loop.QuitClosure()
                               : base::OnceClosure(),
@@ -535,11 +535,11 @@
           &on_response_received_loop),
       base::BindOnce(
           [](const network::URLLoaderCompletionStatus& completion_status) {
-            NOTREACHED();
+            NOTREACHED_IN_MIGRATION();
           }),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       std::get<0>(GetParam()) ? on_head_received_loop.QuitClosure()
                               : base::OnceClosure(),
@@ -603,7 +603,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       std::get<0>(GetParam()) ? on_head_received_loop.QuitClosure()
                               : base::OnceClosure(),
@@ -656,7 +656,7 @@
       test_url_loader_factory(), *prefetch_request,
       TRAFFIC_ANNOTATION_FOR_TESTS, /*timeout_duration=*/base::TimeDelta(),
       base::BindOnce([](network::mojom::URLResponseHead* head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return std::optional<PrefetchErrorOnResponseReceived>();
       }),
       base::BindOnce(
@@ -667,7 +667,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       std::get<0>(GetParam()) ? on_head_received_loop.QuitClosure()
                               : base::OnceClosure(),
@@ -729,7 +729,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       std::get<0>(GetParam()) ? on_head_received_loop.QuitClosure()
                               : base::OnceClosure(),
@@ -1000,12 +1000,12 @@
       test_url_loader_factory(), *prefetch_request,
       TRAFFIC_ANNOTATION_FOR_TESTS, /*timeout_duration=*/base::TimeDelta(),
       base::BindOnce([](network::mojom::URLResponseHead* head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return std::optional<PrefetchErrorOnResponseReceived>();
       }),
       base::BindOnce(
           [](const network::URLLoaderCompletionStatus& completion_status) {
-            NOTREACHED();
+            NOTREACHED_IN_MIGRATION();
           }),
       CreatePrefetchRedirectCallbackForTest(&on_receive_redirect_loop,
                                             &redirect_info, &redirect_head),
@@ -1061,12 +1061,12 @@
       test_url_loader_factory(), *prefetch_request,
       TRAFFIC_ANNOTATION_FOR_TESTS, /*timeout_duration=*/base::TimeDelta(),
       base::BindOnce([](network::mojom::URLResponseHead* head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return std::optional<PrefetchErrorOnResponseReceived>();
       }),
       base::BindOnce(
           [](const network::URLLoaderCompletionStatus& completion_status) {
-            NOTREACHED();
+            NOTREACHED_IN_MIGRATION();
           }),
       CreatePrefetchRedirectCallbackForTest(&on_receive_redirect_loop,
                                             &redirect_info, &redirect_head),
@@ -1166,12 +1166,12 @@
       test_url_loader_factory(), *prefetch_request,
       TRAFFIC_ANNOTATION_FOR_TESTS, /*timeout_duration=*/base::TimeDelta(),
       base::BindOnce([](network::mojom::URLResponseHead* head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return std::optional<PrefetchErrorOnResponseReceived>();
       }),
       base::BindOnce(
           [](const network::URLLoaderCompletionStatus& completion_status) {
-            NOTREACHED();
+            NOTREACHED_IN_MIGRATION();
           }),
       CreatePrefetchRedirectCallbackForTest(&on_receive_redirect_loop,
                                             &redirect_info, &redirect_head),
@@ -1249,7 +1249,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       std::get<0>(GetParam()) ? on_head_received_loop.QuitClosure()
                               : base::OnceClosure(),
@@ -1300,7 +1300,7 @@
       test_url_loader_factory(), *prefetch_request,
       TRAFFIC_ANNOTATION_FOR_TESTS, /*timeout_duration=*/base::Seconds(1),
       base::BindOnce([](network::mojom::URLResponseHead* head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return std::optional<PrefetchErrorOnResponseReceived>();
       }),
       base::BindOnce(
@@ -1312,7 +1312,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       std::get<0>(GetParam()) ? on_head_received_loop.QuitClosure()
                               : base::OnceClosure(),
@@ -1375,7 +1375,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       base::OnceClosure(), response_reader->GetWeakPtr());
 
@@ -1481,7 +1481,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       base::OnceClosure(), response_reader->GetWeakPtr());
 
@@ -1553,7 +1553,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       base::OnceClosure(), response_reader->GetWeakPtr());
 
diff --git a/content/browser/preloading/prefetch/prefetch_test_utils.cc b/content/browser/preloading/prefetch/prefetch_test_utils.cc
index 317c1bdf..f7181fa6 100644
--- a/content/browser/preloading/prefetch/prefetch_test_utils.cc
+++ b/content/browser/preloading/prefetch/prefetch_test_utils.cc
@@ -80,7 +80,7 @@
           &on_response_complete_loop),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       base::BindOnce(&PrefetchContainer::OnReceivedHead,
                      prefetch_container->GetWeakPtr()),
@@ -123,7 +123,7 @@
                      prefetch_container->GetWeakPtr()),
       base::BindRepeating([](const net::RedirectInfo& redirect_info,
                              network::mojom::URLResponseHeadPtr response_head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }),
       base::BindOnce(&PrefetchContainer::OnReceivedHead,
                      prefetch_container->GetWeakPtr()),
@@ -254,12 +254,12 @@
       &test_url_loader_factory, *original_request, TRAFFIC_ANNOTATION_FOR_TESTS,
       /*timeout_duration=*/base::TimeDelta(),
       base::BindOnce([](network::mojom::URLResponseHead* head) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return std::optional<PrefetchErrorOnResponseReceived>();
       }),
       base::BindOnce(
           [](const network::URLLoaderCompletionStatus& completion_status) {
-            NOTREACHED();
+            NOTREACHED_IN_MIGRATION();
           }),
       CreatePrefetchRedirectCallbackForTest(&on_receive_redirect_loop,
                                             &redirect_info, &redirect_head),
@@ -322,7 +322,7 @@
           base::BindRepeating(
               [](const net::RedirectInfo& redirect_info,
                  network::mojom::URLResponseHeadPtr response_head) {
-                NOTREACHED();
+                NOTREACHED_IN_MIGRATION();
               }),
           base::BindOnce(&PrefetchContainer::OnReceivedHead,
                          prefetch_container->GetWeakPtr()),
@@ -368,7 +368,7 @@
 
 void PrefetchTestURLLoaderClient::OnReceiveEarlyHints(
     network::mojom::EarlyHintsPtr early_hints) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void PrefetchTestURLLoaderClient::OnReceiveResponse(
@@ -402,7 +402,7 @@
     int64_t current_position,
     int64_t total_size,
     OnUploadProgressCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void PrefetchTestURLLoaderClient::OnTransferSizeUpdated(
diff --git a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc
index d7b58e00..2edce61 100644
--- a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc
+++ b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc
@@ -75,7 +75,7 @@
 const char kTLSCanaryCheckAddress[] = "http://testtlscanarycheck.com";
 
 void UnreachableFallback(ResponseHeadUpdateParams) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 // "arg" type is `url::Origin`.
diff --git a/content/browser/preloading/preloading.cc b/content/browser/preloading/preloading.cc
index 6805d40..658fd8d 100644
--- a/content/browser/preloading/preloading.cc
+++ b/content/browser/preloading/preloading.cc
@@ -47,7 +47,7 @@
       // for embedder trigger code-path (while you might want to be specific
       // about the `PreloadingPredictor` more than just "embedder").
       // Revisit if needed.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   NOTREACHED_NORETURN();
 }
diff --git a/content/browser/preloading/preloading_attempt_impl.cc b/content/browser/preloading/preloading_attempt_impl.cc
index def448da..0a22e8a 100644
--- a/content/browser/preloading/preloading_attempt_impl.cc
+++ b/content/browser/preloading/preloading_attempt_impl.cc
@@ -11,8 +11,8 @@
 #include "base/strings/strcat.h"
 #include "content/browser/preloading/preloading.h"
 #include "content/browser/preloading/preloading_config.h"
-#include "content/browser/preloading/prerender/prerender_features.h"
 #include "content/public/browser/preloading.h"
+#include "content/public/common/content_features.h"
 #include "services/metrics/public/cpp/metrics_utils.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
diff --git a/content/browser/preloading/prerender/prerender_features.cc b/content/browser/preloading/prerender/prerender_features.cc
index 594b90c2..53f09206 100644
--- a/content/browser/preloading/prerender/prerender_features.cc
+++ b/content/browser/preloading/prerender/prerender_features.cc
@@ -41,11 +41,4 @@
 const base::FeatureParam<std::string> kPrerender2EmbedderBlockedHostsParam{
     &kPrerender2EmbedderBlockedHosts, "embedder_blocked_hosts", ""};
 
-// Prerender2 support for No-Vary-Search header. Enables prerender matching
-// at navigation time using non-exact URL matching based on the prerender
-// No-Vary-Search header.
-BASE_FEATURE(kPrerender2NoVarySearch,
-             "Prerender2NoVarySearch",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 }  // namespace features
diff --git a/content/browser/preloading/prerender/prerender_features.h b/content/browser/preloading/prerender/prerender_features.h
index 2fafbdfc..c973426 100644
--- a/content/browser/preloading/prerender/prerender_features.h
+++ b/content/browser/preloading/prerender/prerender_features.h
@@ -19,8 +19,6 @@
 CONTENT_EXPORT extern const base::FeatureParam<std::string>
     kPrerender2EmbedderBlockedHostsParam;
 
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrerender2NoVarySearch);
-
 }  // namespace features
 
 #endif  // CONTENT_BROWSER_PRELOADING_PRERENDER_PRERENDER_FEATURES_H_
diff --git a/content/browser/process_internals/process_internals_handler_impl.cc b/content/browser/process_internals/process_internals_handler_impl.cc
index 7a0c8e8..813e54f 100644
--- a/content/browser/process_internals/process_internals_handler_impl.cc
+++ b/content/browser/process_internals/process_internals_handler_impl.cc
@@ -171,7 +171,7 @@
     case IsolatedOriginSource::WEB_TRIGGERED:
       return "Web-triggered";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "";
   }
 }
diff --git a/content/browser/push_messaging/push_messaging_manager.cc b/content/browser/push_messaging/push_messaging_manager.cc
index 7c1f2f8..7fe6eb2 100644
--- a/content/browser/push_messaging/push_messaging_manager.cc
+++ b/content/browser/push_messaging/push_messaging_manager.cc
@@ -100,7 +100,7 @@
     case blink::mojom::PushUnregistrationStatus::NETWORK_ERROR:
       return "Unregistration failed - could not connect to push server";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return "";
 }
 
@@ -591,7 +591,7 @@
                                   unregistration_status)) /* error_message */);
       break;
     case blink::mojom::PushUnregistrationStatus::NETWORK_ERROR:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   RecordUnregistrationStatus(unregistration_status);
diff --git a/content/browser/push_messaging/push_messaging_router.cc b/content/browser/push_messaging/push_messaging_router.cc
index 3726401..8c63fe2 100644
--- a/content/browser/push_messaging/push_messaging_router.cc
+++ b/content/browser/push_messaging/push_messaging_router.cc
@@ -232,9 +232,10 @@
     case blink::ServiceWorkerStatusCode::kErrorInvalidArguments:
     case blink::ServiceWorkerStatusCode::kErrorStorageDisconnected:
     case blink::ServiceWorkerStatusCode::kErrorStorageDataCorrupted:
-      NOTREACHED() << "Got unexpected error code: "
-                   << static_cast<uint32_t>(service_worker_status) << " "
-                   << blink::ServiceWorkerStatusToString(service_worker_status);
+      NOTREACHED_IN_MIGRATION()
+          << "Got unexpected error code: "
+          << static_cast<uint32_t>(service_worker_status) << " "
+          << blink::ServiceWorkerStatusToString(service_worker_status);
       push_event_status = blink::mojom::PushEventStatus::SERVICE_WORKER_ERROR;
       break;
   }
diff --git a/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc b/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc
index 2e3a23a..cf3cb02 100644
--- a/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc
+++ b/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc
@@ -194,7 +194,7 @@
     case Reason::kUnknown:
       return ProtoEnum::UNKNOWN;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return ProtoEnum::UNKNOWN;
 }
 
diff --git a/content/browser/renderer_host/blocked_scheme_navigation_browsertest.cc b/content/browser/renderer_host/blocked_scheme_navigation_browsertest.cc
index 1107e42..27a06a5 100644
--- a/content/browser/renderer_host/blocked_scheme_navigation_browsertest.cc
+++ b/content/browser/renderer_host/blocked_scheme_navigation_browsertest.cc
@@ -401,7 +401,7 @@
         break;
 
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
   }
 
@@ -432,7 +432,7 @@
         break;
 
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
   }
 
diff --git a/content/browser/renderer_host/browsing_context_group_swap.cc b/content/browser/renderer_host/browsing_context_group_swap.cc
index 8eae7f98..4a52ff07 100644
--- a/content/browser/renderer_host/browsing_context_group_swap.cc
+++ b/content/browser/renderer_host/browsing_context_group_swap.cc
@@ -49,7 +49,7 @@
     case BrowsingContextGroupSwapType::kProactiveSwap:
       return true;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -64,7 +64,7 @@
     case BrowsingContextGroupSwapType::kCoopSwap:
       return true;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -79,7 +79,7 @@
     case BrowsingContextGroupSwapType::kRelatedCoopSwap:
       return true;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
diff --git a/content/browser/renderer_host/clipboard_host_impl.cc b/content/browser/renderer_host/clipboard_host_impl.cc
index e347733a..6568dd1 100644
--- a/content/browser/renderer_host/clipboard_host_impl.cc
+++ b/content/browser/renderer_host/clipboard_host_impl.cc
@@ -795,7 +795,7 @@
     clipboard_writer_->WritePickledData(
         pickle, ui::ClipboardFormatType::WebCustomDataType());
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   if (pending_commit_write_) {
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
index a9a4c23..93591e8a 100644
--- a/content/browser/renderer_host/compositor_impl_android.cc
+++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -863,7 +863,7 @@
 }
 
 void CompositorImpl::OnFirstSurfaceActivation(const viz::SurfaceInfo& info) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void CompositorImpl::CacheBackBufferForCurrentSurface() {
diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc
index 974e01c1..6b2c1e7 100644
--- a/content/browser/renderer_host/delegated_frame_host.cc
+++ b/content/browser/renderer_host/delegated_frame_host.cc
@@ -350,7 +350,7 @@
 
 void DelegatedFrameHost::OnFirstSurfaceActivation(
     const viz::SurfaceInfo& surface_info) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void DelegatedFrameHost::OnFrameTokenChanged(uint32_t frame_token,
diff --git a/content/browser/renderer_host/direct_manipulation_event_handler_win.cc b/content/browser/renderer_host/direct_manipulation_event_handler_win.cc
index ac62383..02f514d 100644
--- a/content/browser/renderer_host/direct_manipulation_event_handler_win.cc
+++ b/content/browser/renderer_host/direct_manipulation_event_handler_win.cc
@@ -86,7 +86,7 @@
       break;
     }
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   // Start the new sequence.
@@ -115,7 +115,7 @@
       break;
     }
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/renderer_host/direct_manipulation_test_helper_win.cc b/content/browser/renderer_host/direct_manipulation_test_helper_win.cc
index c0a5bf5..99337c7c 100644
--- a/content/browser/renderer_host/direct_manipulation_test_helper_win.cc
+++ b/content/browser/renderer_host/direct_manipulation_test_helper_win.cc
@@ -35,43 +35,43 @@
 
 // Other Overrides
 HRESULT MockDirectManipulationContent::GetContentRect(RECT* contentSize) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return S_OK;
 }
 
 HRESULT
 MockDirectManipulationContent::SetContentRect(const RECT* contentSize) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return S_OK;
 }
 
 HRESULT MockDirectManipulationContent::GetViewport(REFIID riid, void** object) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return S_OK;
 }
 
 HRESULT MockDirectManipulationContent::GetTag(REFIID riid,
                                               void** object,
                                               UINT32* id) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return S_OK;
 }
 
 HRESULT MockDirectManipulationContent::SetTag(IUnknown* object, UINT32 id) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return S_OK;
 }
 
 HRESULT MockDirectManipulationContent::GetOutputTransform(float* matrix,
                                                           DWORD point_count) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return S_OK;
 }
 
 HRESULT
 MockDirectManipulationContent::SyncContentTransform(const float* matrix,
                                                     DWORD point_count) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return S_OK;
 }
 
diff --git a/content/browser/renderer_host/frame_tree.cc b/content/browser/renderer_host/frame_tree.cc
index dfc3dd2..746b4fb 100644
--- a/content/browser/renderer_host/frame_tree.cc
+++ b/content/browser/renderer_host/frame_tree.cc
@@ -483,7 +483,7 @@
 void FrameTree::RemoveFrame(FrameTreeNode* child) {
   RenderFrameHostImpl* parent = child->parent();
   if (!parent) {
-    NOTREACHED() << "Unexpected RemoveFrame call for main frame.";
+    NOTREACHED_IN_MIGRATION() << "Unexpected RemoveFrame call for main frame.";
     return;
   }
 
diff --git a/content/browser/renderer_host/http_error_navigation_throttle.cc b/content/browser/renderer_host/http_error_navigation_throttle.cc
index 57105ea..5024b01 100644
--- a/content/browser/renderer_host/http_error_navigation_throttle.cc
+++ b/content/browser/renderer_host/http_error_navigation_throttle.cc
@@ -85,7 +85,7 @@
       body_consumer_watcher_.ArmOrNotify();
       return;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return;
   }
 
diff --git a/content/browser/renderer_host/input/motion_event_web.cc b/content/browser/renderer_host/input/motion_event_web.cc
index 0ef741a..b5c13ce 100644
--- a/content/browser/renderer_host/input/motion_event_web.cc
+++ b/content/browser/renderer_host/input/motion_event_web.cc
@@ -44,7 +44,7 @@
     default:
       break;
   };
-  NOTREACHED()
+  NOTREACHED_IN_MIGRATION()
       << "Unable to derive a valid MotionEvent::Action from the WebTouchEvent.";
   return ui::MotionEvent::Action::CANCEL;
 }
@@ -214,7 +214,7 @@
     case WebPointerProperties::PointerType::kTouch:
       return ToolType::FINGER;
   }
-  NOTREACHED() << "Unexpected pointerType";
+  NOTREACHED_IN_MIGRATION() << "Unexpected pointerType";
   return ToolType::UNKNOWN;
 }
 
diff --git a/content/browser/renderer_host/input/mouse_wheel_phase_handler.cc b/content/browser/renderer_host/input/mouse_wheel_phase_handler.cc
index 0f173dd9..f25303f8 100644
--- a/content/browser/renderer_host/input/mouse_wheel_phase_handler.cc
+++ b/content/browser/renderer_host/input/mouse_wheel_phase_handler.cc
@@ -98,7 +98,7 @@
         mouse_wheel_event.phase = blink::WebMouseWheelEvent::kPhaseChanged;
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
   }
 
diff --git a/content/browser/renderer_host/input/render_widget_host_latency_tracker.cc b/content/browser/renderer_host/input/render_widget_host_latency_tracker.cc
index f1aa2eb4..81f54db 100644
--- a/content/browser/renderer_host/input/render_widget_host_latency_tracker.cc
+++ b/content/browser/renderer_host/input/render_widget_host_latency_tracker.cc
@@ -76,7 +76,7 @@
     CASE_TYPE(PointerCausedUaAction);
   }
 #undef CASE_TYPE
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return "";
 }
 }  // namespace
diff --git a/content/browser/renderer_host/input/stylus_text_selector.cc b/content/browser/renderer_host/input/stylus_text_selector.cc
index cb5419c..2d99fe1 100644
--- a/content/browser/renderer_host/input/stylus_text_selector.cc
+++ b/content/browser/renderer_host/input/stylus_text_selector.cc
@@ -98,7 +98,7 @@
     case MotionEvent::Action::HOVER_MOVE:
     case MotionEvent::Action::BUTTON_PRESS:
     case MotionEvent::Action::BUTTON_RELEASE:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 
diff --git a/content/browser/renderer_host/input/synthetic_gesture_target_android.cc b/content/browser/renderer_host/input/synthetic_gesture_target_android.cc
index f955aa7..d5540c6a 100644
--- a/content/browser/renderer_host/input/synthetic_gesture_target_android.cc
+++ b/content/browser/renderer_host/input/synthetic_gesture_target_android.cc
@@ -113,7 +113,7 @@
       action = MOTION_EVENT_ACTION_END;
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   const unsigned num_touches = web_touch.touches_length;
   int touch_index = -1;
diff --git a/content/browser/renderer_host/input/synthetic_gesture_target_base.cc b/content/browser/renderer_host/input/synthetic_gesture_target_base.cc
index e8bedfbe..952f422 100644
--- a/content/browser/renderer_host/input/synthetic_gesture_target_base.cc
+++ b/content/browser/renderer_host/input/synthetic_gesture_target_base.cc
@@ -124,7 +124,7 @@
     }
     DispatchWebGestureEventToPlatform(web_fling, latency_info);
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/renderer_host/input/synthetic_gesture_target_mac.mm b/content/browser/renderer_host/input/synthetic_gesture_target_mac.mm
index 76b9976..2c3ad3b 100644
--- a/content/browser/renderer_host/input/synthetic_gesture_target_mac.mm
+++ b/content/browser/renderer_host/input/synthetic_gesture_target_mac.mm
@@ -128,7 +128,7 @@
         return;
       }
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
   }
 }
diff --git a/content/browser/renderer_host/input/touch_emulator.cc b/content/browser/renderer_host/input/touch_emulator.cc
index 189ba8c..ee0e9a2e 100644
--- a/content/browser/renderer_host/input/touch_emulator.cc
+++ b/content/browser/renderer_host/input/touch_emulator.cc
@@ -383,7 +383,7 @@
 
   switch (gesture_event.GetType()) {
     case WebInputEvent::Type::kUndefined:
-      NOTREACHED() << "Undefined WebInputEvent type";
+      NOTREACHED_IN_MIGRATION() << "Undefined WebInputEvent type";
       // Bail without sending the junk event to the client.
       return;
 
@@ -565,8 +565,8 @@
       break;
     default:
       eventType = WebInputEvent::Type::kUndefined;
-      NOTREACHED() << "Invalid event for touch emulation: "
-                   << mouse_event.GetType();
+      NOTREACHED_IN_MIGRATION()
+          << "Invalid event for touch emulation: " << mouse_event.GetType();
   }
   touch_event_.touches_length = 1;
   touch_event_.SetModifiers(ModifiersWithoutMouseButtons(mouse_event));
diff --git a/content/browser/renderer_host/input/touch_selection_controller_client_aura.cc b/content/browser/renderer_host/input/touch_selection_controller_client_aura.cc
index a5fce16..b368b238 100644
--- a/content/browser/renderer_host/input/touch_selection_controller_client_aura.cc
+++ b/content/browser/renderer_host/input/touch_selection_controller_client_aura.cc
@@ -366,16 +366,16 @@
 
 bool TouchSelectionControllerClientAura::InternalClient::SupportsAnimation()
     const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 void TouchSelectionControllerClientAura::SetNeedsAnimate() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void TouchSelectionControllerClientAura::InternalClient::SetNeedsAnimate() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void TouchSelectionControllerClientAura::MoveCaret(
@@ -464,7 +464,7 @@
 
 void TouchSelectionControllerClientAura::InternalClient::OnSelectionEvent(
     ui::SelectionEventType event) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void TouchSelectionControllerClientAura::OnDragUpdate(
@@ -474,7 +474,7 @@
 void TouchSelectionControllerClientAura::InternalClient::OnDragUpdate(
     const ui::TouchSelectionDraggable::Type type,
     const gfx::PointF& position) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 std::unique_ptr<ui::TouchHandleDrawable>
@@ -490,7 +490,7 @@
 
 std::unique_ptr<ui::TouchHandleDrawable>
 TouchSelectionControllerClientAura::InternalClient::CreateDrawable() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
@@ -568,7 +568,7 @@
           /*should_show_context_menu=*/false);
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 }
diff --git a/content/browser/renderer_host/input/touch_selection_controller_client_child_frame.cc b/content/browser/renderer_host/input/touch_selection_controller_client_child_frame.cc
index 7fe080cb..0c0ed4f 100644
--- a/content/browser/renderer_host/input/touch_selection_controller_client_child_frame.cc
+++ b/content/browser/renderer_host/input/touch_selection_controller_client_child_frame.cc
@@ -119,12 +119,12 @@
 }
 
 bool TouchSelectionControllerClientChildFrame::SupportsAnimation() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 void TouchSelectionControllerClientChildFrame::SetNeedsAnimate() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void TouchSelectionControllerClientChildFrame::MoveCaret(
@@ -152,18 +152,18 @@
 
 void TouchSelectionControllerClientChildFrame::OnSelectionEvent(
     ui::SelectionEventType event) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void TouchSelectionControllerClientChildFrame::OnDragUpdate(
     const ui::TouchSelectionDraggable::Type type,
     const gfx::PointF& position) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 std::unique_ptr<ui::TouchHandleDrawable>
 TouchSelectionControllerClientChildFrame::CreateDrawable() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
@@ -236,7 +236,7 @@
           /*should_show_context_menu=*/false);
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 }
diff --git a/content/browser/renderer_host/media/audio_input_device_manager.cc b/content/browser/renderer_host/media/audio_input_device_manager.cc
index 8bc0901..b82463da 100644
--- a/content/browser/renderer_host/media/audio_input_device_manager.cc
+++ b/content/browser/renderer_host/media/audio_input_device_manager.cc
@@ -46,7 +46,7 @@
     case blink::mojom::MediaStreamType::DISPLAY_AUDIO_CAPTURE:
       return "DISPLAY_AUDIO_CAPTURE";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return "INVALID";
 }
diff --git a/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc b/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc
index b798bd4..6aa143bb 100644
--- a/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc
+++ b/content/browser/renderer_host/media/in_process_video_capture_device_launcher.cc
@@ -127,7 +127,7 @@
                                 : TAB_VIDEO_CAPTURER_CREATED_WITHOUT_AUDIO);
       break;
     case DesktopMediaID::TYPE_NONE:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 }
@@ -361,7 +361,7 @@
 #endif  // BUILDFLAG(ENABLE_SCREEN_CAPTURE)
 
     default:
-      NOTREACHED() << "unsupported stream type=" << stream_type;
+      NOTREACHED_IN_MIGRATION() << "unsupported stream type=" << stream_type;
       start_capture_closure =
           base::BindOnce(std::move(after_start_capture_callback), nullptr);
   }
diff --git a/content/browser/renderer_host/media/in_process_video_capture_provider.cc b/content/browser/renderer_host/media/in_process_video_capture_provider.cc
index 6b5181b..3db48d5 100644
--- a/content/browser/renderer_host/media/in_process_video_capture_provider.cc
+++ b/content/browser/renderer_host/media/in_process_video_capture_provider.cc
@@ -29,7 +29,7 @@
 
 void InProcessVideoCaptureProvider::GetDeviceInfosAsync(
     GetDeviceInfosCallback result_callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 std::unique_ptr<VideoCaptureDeviceLauncher>
diff --git a/content/browser/renderer_host/media/media_devices_manager.cc b/content/browser/renderer_host/media/media_devices_manager.cc
index f3005bf6..b4ad5cb 100644
--- a/content/browser/renderer_host/media/media_devices_manager.cc
+++ b/content/browser/renderer_host/media/media_devices_manager.cc
@@ -80,7 +80,7 @@
     case MediaDeviceType::kMediaAudioOuput:
       return "AUDIO_OUTPUT";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return "UNKNOWN";
 }
@@ -1006,7 +1006,7 @@
       EnumerateAudioDevices(false /* is_input */);
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 }
 
@@ -1198,7 +1198,7 @@
           is_ready = false;
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
   }
   return is_ready;
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index ee226ad..b4e2feb5 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -186,7 +186,7 @@
     case MediaDeviceType::kMediaVideoInput:
       return MediaStreamType::DEVICE_VIDEO_CAPTURE;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   return MediaStreamType::NO_SERVICE;
@@ -201,7 +201,7 @@
     case MediaDeviceType::kMediaVideoInput:
       return "DEVICE_VIDEO_INPUT";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return "INVALID";
 }
@@ -219,7 +219,7 @@
     case blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY:
       return "MEDIA_OPEN_DEVICE_PEPPER_ONLY";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return "INVALID";
 }
@@ -251,7 +251,7 @@
     case blink::mojom::MediaStreamType::NUM_MEDIA_TYPES:
       return "NUM_MEDIA_TYPES";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return "INVALID";
 }
@@ -273,7 +273,7 @@
     case MEDIA_REQUEST_STATE_ERROR:
       return "STATE_ERROR";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return "INVALID";
 }
@@ -316,7 +316,7 @@
     case blink::mojom::MediaStreamRequestResult::NUM_MEDIA_REQUEST_RESULTS:
       return "NUM_MEDIA_REQUEST_RESULTS";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return "INVALID";
 }
@@ -837,7 +837,7 @@
   // an internal callback in those subclasses).
   virtual void PanTiltZoomPermissionChecked(const std::string& label,
                                             bool pan_tilt_zoom_allowed) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   // TODO(crbug.com/40247147): Combine FinalizeRequest and
@@ -848,7 +848,7 @@
   virtual void FinalizeMediaAccessRequest(
       const std::string& label,
       const blink::mojom::StreamDevicesSet&) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   virtual void FinalizeRequestFailed(MediaStreamRequestResult result) = 0;
@@ -2117,7 +2117,7 @@
     controls.video.stream_type = type;
     controls.video.device_ids.push_back(device_id);
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   auto request = std::make_unique<OpenDeviceRequest>(
       render_frame_host_id, requester_id, page_request_id, controls,
@@ -2227,7 +2227,7 @@
                                   request->stream_controls().video, devices,
                                   device_ids);
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   return false;
 }
@@ -3203,7 +3203,7 @@
       return;
     }
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 
@@ -3396,7 +3396,7 @@
       OnStreamStarted(label);
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 }
@@ -3868,7 +3868,7 @@
       media_observer->OnVideoCaptureDevicesChanged();
     }
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/renderer_host/media/service_launched_video_capture_device.cc b/content/browser/renderer_host/media/service_launched_video_capture_device.cc
index 78787e4..2f6a917 100644
--- a/content/browser/renderer_host/media/service_launched_video_capture_device.cc
+++ b/content/browser/renderer_host/media/service_launched_video_capture_device.cc
@@ -102,7 +102,7 @@
   // This method should only be called for desktop capture devices.
   // The video_capture Mojo service does not support desktop capture devices
   // (yet) and should not be used for it.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ServiceLaunchedVideoCaptureDevice::OnUtilizationReport(
diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc
index 122ee8d..19b87ec 100644
--- a/content/browser/renderer_host/media/video_capture_controller.cc
+++ b/content/browser/renderer_host/media/video_capture_controller.cc
@@ -182,7 +182,7 @@
     return media::mojom::VideoBufferHandle::NewGpuMemoryBufferHandle(
         buffer_handle_->get_gpu_memory_buffer_handle().Clone());
   } else {
-    NOTREACHED() << "Unexpected video buffer handle type";
+    NOTREACHED_IN_MIGRATION() << "Unexpected video buffer handle type";
     return media::mojom::VideoBufferHandlePtr();
   }
 }
@@ -517,8 +517,8 @@
                       frame_context->buffer_context_id())) {
     client->buffers_in_use.push_back(frame_context->buffer_context_id());
   } else {
-    NOTREACHED() << "Unexpected duplicate buffer: "
-                 << frame_context->buffer_context_id();
+    NOTREACHED_IN_MIGRATION() << "Unexpected duplicate buffer: "
+                              << frame_context->buffer_context_id();
   }
   frame_context->IncreaseConsumerCount();
 }
diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc
index 3db89a04..4e3ccc00 100644
--- a/content/browser/renderer_host/media/video_capture_manager.cc
+++ b/content/browser/renderer_host/media/video_capture_manager.cc
@@ -521,7 +521,7 @@
   DCHECK(controller);
   DCHECK(client_handler);
   if (!IsControllerPointerValid(controller))
-    NOTREACHED() << "Got Null controller while pausing capture";
+    NOTREACHED_IN_MIGRATION() << "Got Null controller while pausing capture";
 
   const bool had_active_client = controller->HasActiveClient();
   controller->PauseClient(client_id, client_handler);
@@ -543,7 +543,7 @@
   DCHECK(client_handler);
 
   if (!IsControllerPointerValid(controller))
-    NOTREACHED() << "Got Null controller while resuming capture";
+    NOTREACHED_IN_MIGRATION() << "Got Null controller while resuming capture";
 
   const bool had_active_client = controller->HasActiveClient();
   controller->ResumeClient(client_id, client_handler);
diff --git a/content/browser/renderer_host/mixed_content_checker.cc b/content/browser/renderer_host/mixed_content_checker.cc
index 04f17603..cb318c3 100644
--- a/content/browser/renderer_host/mixed_content_checker.cc
+++ b/content/browser/renderer_host/mixed_content_checker.cc
@@ -169,9 +169,10 @@
     case blink::mojom::RequestContextType::PLUGIN:
     case blink::mojom::RequestContextType::VIDEO:
     default:
-      NOTREACHED() << "RequestContextType has value " << request_context_type
-                   << " and has MixedContentContextType of "
-                   << mixed_content_context_type;
+      NOTREACHED_IN_MIGRATION()
+          << "RequestContextType has value " << request_context_type
+          << " and has MixedContentContextType of "
+          << mixed_content_context_type;
       return;
   }
   mixed_content_features.insert(feature);
@@ -319,7 +320,7 @@
       break;
 
     case blink::mojom::MixedContentContextType::kNotMixedContent:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   };
 
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc
index 0308c27..f1f6524 100644
--- a/content/browser/renderer_host/navigation_controller_impl.cc
+++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -163,7 +163,7 @@
     case NavigationController::UA_OVERRIDE_FALSE:
       return false;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -462,7 +462,7 @@
   FrameNavigationEntry* frame_entry =
       entry->GetFrameEntry(request->frame_tree_node());
   if (!frame_entry) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
@@ -475,7 +475,7 @@
                 frame_entry->redirect_chain()[i]);
     }
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 #endif  // DCHECK_IS_ON()
@@ -1350,7 +1350,7 @@
       break;
     case LOAD_TYPE_DATA:
       if (!params.url.SchemeIs(url::kDataScheme)) {
-        NOTREACHED() << "Data load must use data scheme.";
+        NOTREACHED_IN_MIGRATION() << "Data load must use data scheme.";
         return nullptr;
       }
       break;
@@ -1609,7 +1609,7 @@
       }
       break;
     case NAVIGATION_TYPE_UNKNOWN:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
index 3b43593..b077458 100644
--- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -173,7 +173,7 @@
 #if BUILDFLAG(IS_ANDROID)
       shell()->LoadDataAsStringWithBaseURL(history_url, data, base_url);
 #else
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
 #endif
     } else {
       shell()->LoadDataWithBaseURL(history_url, data, base_url);
@@ -499,7 +499,7 @@
     shell()->LoadDataAsStringWithBaseURL(supplied_history_url, data,
                                          supplied_base_url);
 #else
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 #endif
   } else {
     shell()->LoadDataWithBaseURL(supplied_history_url, data, supplied_base_url);
@@ -1508,7 +1508,7 @@
 #if BUILDFLAG(IS_ANDROID)
     shell()->LoadDataAsStringWithBaseURL(history_url, data, base_url);
 #else
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 #endif
   } else {
     shell()->LoadDataWithBaseURL(history_url, data, base_url);
diff --git a/content/browser/renderer_host/navigation_entry_impl.cc b/content/browser/renderer_host/navigation_entry_impl.cc
index 53ff636..0de65101 100644
--- a/content/browser/renderer_host/navigation_entry_impl.cc
+++ b/content/browser/renderer_host/navigation_entry_impl.cc
@@ -150,7 +150,7 @@
   blink::ExplodedPageState exploded_page_state;
   if (!blink::DecodePageState(node->frame_entry->page_state().ToEncodedData(),
                               &exploded_page_state)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   blink::ExplodedFrameState frame_state = exploded_page_state.top;
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index d1cd324..3925d9334 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -482,7 +482,7 @@
       UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram ".NewNavigation",    \
                                  duration, kMinTime, kMaxTime, kBuckets);     \
     } else {                                                                  \
-      NOTREACHED() << "Invalid page transition: " << transition;              \
+      NOTREACHED_IN_MIGRATION() << "Invalid page transition: " << transition; \
     }                                                                         \
     if (is_background.has_value()) {                                          \
       if (is_background.value()) {                                            \
@@ -734,11 +734,11 @@
       return network::mojom::RequestDestination::kFrame;
     // Main frames are handled above.
     case blink::FrameOwnerElementType::kNone:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return network::mojom::RequestDestination::kDocument;
       // Fenced frames are handled above.
     case blink::FrameOwnerElementType::kFencedframe:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return network::mojom::RequestDestination::kFencedframe;
   }
 }
@@ -2705,7 +2705,7 @@
     // - MHTML document, not supported by CSPEE (https://crbug.com/1164353).
     if (CheckCSPEmbeddedEnforcement() ==
         CSPEmbeddedEnforcementResult::BLOCK_RESPONSE) {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       base::debug::DumpWithoutCrashing();
     }
 
@@ -4881,7 +4881,7 @@
       break;
     case ErrorPageProcess::kNotErrorPage:
     case ErrorPageProcess::kPostCommitErrorPage:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 
@@ -7016,7 +7016,7 @@
       OnWillCommitWithoutUrlLoaderProcessed(result);
       return;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void NavigationRequest::OnWillStartRequestProcessed(
@@ -7249,7 +7249,7 @@
       OnWillCommitWithoutUrlLoaderChecksComplete(result);
       return;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   // DO NOT ADD CODE AFTER THIS, as the NavigationRequest might have been
   // deleted by the previous calls.
@@ -9047,7 +9047,7 @@
           network::mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep &&
       !CompatibleWithCrossOriginIsolated(
           policies.cross_origin_embedder_policy)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     base::debug::DumpWithoutCrashing();
     return false;
   }
diff --git a/content/browser/renderer_host/navigation_request_unittest.cc b/content/browser/renderer_host/navigation_request_unittest.cc
index 40c887c..90bd8d3 100644
--- a/content/browser/renderer_host/navigation_request_unittest.cc
+++ b/content/browser/renderer_host/navigation_request_unittest.cc
@@ -1158,7 +1158,7 @@
       const base::span<const url::Origin> script_origins,
       const base::span<const std::string> header_tokens,
       const base::Time current_time) override {
-    NOTREACHED() << "not used by test";
+    NOTREACHED_IN_MIGRATION() << "not used by test";
   }
   bool IsFeaturePersistedForOrigin(const url::Origin& origin,
                                    const url::Origin& partition_origin,
diff --git a/content/browser/renderer_host/navigation_throttle_runner.cc b/content/browser/renderer_host/navigation_throttle_runner.cc
index 573b3c9..403acae 100644
--- a/content/browser/renderer_host/navigation_throttle_runner.cc
+++ b/content/browser/renderer_host/navigation_throttle_runner.cc
@@ -54,7 +54,7 @@
     case NavigationThrottleRunner::Event::WillCommitWithoutUrlLoader:
       return throttle->WillCommitWithoutUrlLoader();
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return NavigationThrottle::CANCEL_AND_IGNORE;
 }
 
@@ -74,7 +74,7 @@
     case NavigationThrottleRunner::Event::WillCommitWithoutUrlLoader:
       return "NavigationThrottle::WillCommitWithoutUrlLoader";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return "";
 }
 
@@ -94,7 +94,7 @@
     case NavigationThrottleRunner::Event::WillCommitWithoutUrlLoader:
       return "WillCommitWithoutUrlLoader";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return "";
 }
 
diff --git a/content/browser/renderer_host/navigator.cc b/content/browser/renderer_host/navigator.cc
index d80ac72f..5c1702ff 100644
--- a/content/browser/renderer_host/navigator.cc
+++ b/content/browser/renderer_host/navigator.cc
@@ -591,8 +591,8 @@
   const UrlInfo& url_info = navigation_request->GetUrlInfo();
   if (!site_instance->HasSite() &&
       SiteInstanceImpl::ShouldAssignSiteForUrlInfo(url_info)) {
-    NOTREACHED() << "SiteInstance should have already set a site: "
-                 << params.url;
+    NOTREACHED_IN_MIGRATION()
+        << "SiteInstance should have already set a site: " << params.url;
     // TODO(alexmos): convert this to a CHECK and remove the fallback call to
     // ConvertToDefaultOrSetSite() after verifying that this doesn't happen in
     // practice.
@@ -956,7 +956,7 @@
     std::optional<std::u16string> embedder_shared_storage_context) {
   // |method != "POST"| should imply absence of |post_body|.
   if (method != "POST" && post_body) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     post_body = nullptr;
   }
 
diff --git a/content/browser/renderer_host/overscroll_controller.cc b/content/browser/renderer_host/overscroll_controller.cc
index 73ec5bd..551c5ca 100644
--- a/content/browser/renderer_host/overscroll_controller.cc
+++ b/content/browser/renderer_host/overscroll_controller.cc
@@ -302,7 +302,7 @@
           return false;
         break;
       case OVERSCROLL_NONE:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
   }
 
diff --git a/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc b/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc
index 0edb81b..d903033 100644
--- a/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc
+++ b/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc
@@ -143,7 +143,7 @@
     instance_map_[instance] =
         std::make_unique<InstanceData>(renderer_instance_data);
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
@@ -164,7 +164,7 @@
 
     instance_map_.erase(it);
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/renderer_host/pepper/content_browser_pepper_host_factory.cc b/content/browser/renderer_host/pepper/content_browser_pepper_host_factory.cc
index 82abbd0..e9086cfb 100644
--- a/content/browser/renderer_host/pepper/content_browser_pepper_host_factory.cc
+++ b/content/browser/renderer_host/pepper/content_browser_pepper_host_factory.cc
@@ -75,7 +75,7 @@
       PP_FileSystemType file_system_type;
       if (!ppapi::UnpackMessage<PpapiHostMsg_FileSystem_Create>(
               message, &file_system_type)) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return nullptr;
       }
       return std::unique_ptr<ppapi::host::ResourceHost>(
@@ -102,7 +102,7 @@
       std::string internal_path;
       if (!ppapi::UnpackMessage<PpapiHostMsg_FileRef_CreateForFileAPI>(
               message, &file_system, &internal_path)) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return nullptr;
       }
       return std::unique_ptr<ppapi::host::ResourceHost>(new PepperFileRefHost(
diff --git a/content/browser/renderer_host/pepper/pepper_file_system_browser_host.cc b/content/browser/renderer_host/pepper/pepper_file_system_browser_host.cc
index fa23b48c..93258e8 100644
--- a/content/browser/renderer_host/pepper/pepper_file_system_browser_host.cc
+++ b/content/browser/renderer_host/pepper/pepper_file_system_browser_host.cc
@@ -164,7 +164,7 @@
       SendReplyForIsolatedFileSystem(reply_context, fsid, PP_OK);
       return;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       SendReplyForIsolatedFileSystem(reply_context, fsid, PP_ERROR_BADARGUMENT);
       return;
   }
@@ -350,7 +350,7 @@
   int unused;
   if (!browser_ppapi_host_->GetRenderFrameIDsForInstance(
           pp_instance(), &render_process_id, &unused)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   called_open_ = true;
   // Get the file system context asynchronously, and then complete the Open
@@ -406,7 +406,7 @@
   std::pair<FileMap::iterator, bool> insert_result =
       files_.insert(std::make_pair(id, file_io_host));
   if (!insert_result.second) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
@@ -427,7 +427,7 @@
   if (it != files_.end()) {
     files_.erase(it);
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
diff --git a/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc b/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc
index 617acab..02d2036 100644
--- a/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc
+++ b/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc
@@ -95,7 +95,7 @@
 
   if (!host->GetRenderFrameIDsForInstance(
           instance, &render_process_id_, &render_frame_id_)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/renderer_host/pepper/pepper_tcp_server_socket_message_filter.cc b/content/browser/renderer_host/pepper/pepper_tcp_server_socket_message_filter.cc
index 7ee1f27..254abc0e 100644
--- a/content/browser/renderer_host/pepper/pepper_tcp_server_socket_message_filter.cc
+++ b/content/browser/renderer_host/pepper/pepper_tcp_server_socket_message_filter.cc
@@ -76,7 +76,7 @@
   DCHECK(ppapi_host_);
   if (!host->GetRenderFrameIDsForInstance(instance, &render_process_id_,
                                           &render_frame_id_)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter.cc b/content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter.cc
index ad587d9f2..460aee8 100644
--- a/content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter.cc
+++ b/content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter.cc
@@ -99,7 +99,7 @@
   host_->AddInstanceObserver(instance_, this);
   if (!host->GetRenderFrameIDsForInstance(instance, &render_process_id_,
                                           &render_frame_id_)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
@@ -300,7 +300,7 @@
 
   // This is only supported by PPB_TCPSocket v1.1 or above.
   if (version_ != ppapi::TCP_SOCKET_VERSION_1_1_OR_ABOVE) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return PP_ERROR_NOACCESS;
   }
 
@@ -360,7 +360,7 @@
 
   // This is only supported by PPB_TCPSocket_Private.
   if (!IsPrivateAPI()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return PP_ERROR_NOACCESS;
   }
 
@@ -373,8 +373,9 @@
   }
 
   if (!state_.IsValidTransition(TCPSocketState::CONNECT)) {
-    NOTREACHED() << "This shouldn't be reached since the renderer only tries "
-                 << "to connect once.";
+    NOTREACHED_IN_MIGRATION()
+        << "This shouldn't be reached since the renderer only tries "
+        << "to connect once.";
     return PP_ERROR_FAILED;
   }
 
@@ -563,7 +564,7 @@
 
   // This is only supported by PPB_TCPSocket v1.1 or above.
   if (version_ != ppapi::TCP_SOCKET_VERSION_1_1_OR_ABOVE) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return PP_ERROR_NOACCESS;
   }
 
@@ -716,7 +717,7 @@
       return PP_OK;
     }
     default: {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return PP_ERROR_BADARGUMENT;
     }
   }
diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
index d3e6a6b..4e7076b 100644
--- a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
+++ b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
@@ -98,7 +98,7 @@
 
   if (!host->GetRenderFrameIDsForInstance(instance, &render_process_id_,
                                           &render_frame_id_)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
@@ -305,7 +305,7 @@
       return PP_OK;
     }
     default: {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return PP_ERROR_BADARGUMENT;
     }
   }
@@ -447,7 +447,7 @@
       num_bytes >
           static_cast<size_t>(UDPSocketResourceConstants::kMaxWriteSize)) {
     // Size of |data| is checked on the plugin side.
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return PP_ERROR_BADARGUMENT;
   }
 
diff --git a/content/browser/renderer_host/pepper/quota_reservation.cc b/content/browser/renderer_host/pepper/quota_reservation.cc
index 7a7c10211..6b581c15 100644
--- a/content/browser/renderer_host/pepper/quota_reservation.cc
+++ b/content/browser/renderer_host/pepper/quota_reservation.cc
@@ -62,7 +62,7 @@
         file_system_context_->operation_runner()->SyncGetPlatformPath(
             url, &platform_file_path);
     if (error != base::File::FILE_OK) {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return 0;
     }
   } else {
@@ -79,7 +79,7 @@
     std::ignore = file_handle.release();
     return max_written_offset;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return 0;
 }
 
@@ -92,7 +92,7 @@
     delete it->second;
     files_.erase(it);
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
@@ -106,7 +106,7 @@
       it->second->AddAppendModeWriteAmount(
           growth_it->second.append_mode_write_amount);
     } else {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
   }
 
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 19fddea3..dab6ea2 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -473,7 +473,7 @@
       return BackForwardCacheMetrics::NotRestoredReason::
           kBroadcastChannelOnMessage;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return BackForwardCacheMetrics::NotRestoredReason::kUnknown;
 }
 
@@ -896,7 +896,7 @@
           FRAME_DELETE_INTENTION_SPECULATIVE_MAIN_FRAME_FOR_NAVIGATION_CANCELLED;
   }
   // All cases should've been handled by the switch case above.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return ProtoLevel::FRAME_DELETE_INTENTION_NOT_MAIN_FRAME;
 }
 
@@ -1904,7 +1904,7 @@
         // replace the `DumpWithoutCrashing` with a `CHECK`. Otherwise, add a
         // new browser test for it.
         base::debug::DumpWithoutCrashing();
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }
     }
   }
@@ -2631,7 +2631,7 @@
     case RenderFrameHostImpl::LifecycleStateImpl::kReadyToBeDeleted:
     case RenderFrameHostImpl::LifecycleStateImpl::kRunningUnloadHandlers:
       // A newly-created frame shouldn't be in any of the states above.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     case RenderFrameHostImpl::LifecycleStateImpl::kSpeculative:
       // No subresource requests should be initiated in the speculative frame.
@@ -2927,7 +2927,7 @@
   // `this` is an `IPC::Listener`, but there is no path by which `this` would
   // receive associated interface requests through this method. Associated
   // interface requests come in through `GetAssociatedInterface()`.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 std::string RenderFrameHostImpl::ToDebugString() {
@@ -5248,7 +5248,7 @@
     frame = frame->GetParent();
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
@@ -5355,7 +5355,8 @@
   // If this RenderFrameHost is already pending deletion, it must have already
   // gone through this, therefore just return.
   if (IsPendingDeletion()) {
-    NOTREACHED() << "RFH should be in default state when calling Unload.";
+    NOTREACHED_IN_MIGRATION()
+        << "RFH should be in default state when calling Unload.";
     return;
   }
 
@@ -6524,7 +6525,7 @@
 void RenderFrameHostImpl::AllowBindings(int bindings_flags) {
   // Never grant any bindings to browser plugin guests.
   if (GetProcess()->IsForGuestsOnly()) {
-    NOTREACHED() << "Never grant bindings to a guest process.";
+    NOTREACHED_IN_MIGRATION() << "Never grant bindings to a guest process.";
     return;
   }
   TRACE_EVENT2("navigation", "RenderFrameHostImpl::AllowBindings",
@@ -10873,9 +10874,9 @@
     // the key does not exceed the 40 character limit.
     SCOPED_CRASH_KEY_BOOL("CommitNavigation", "is_outermost_frame",
                           IsOutermostMainFrame());
-    NOTREACHED() << "Commiting in incompatible process for URL: "
-                 << process_lock.lock_url() << " lock vs "
-                 << common_params->url.DeprecatedGetOriginAsURL();
+    NOTREACHED_IN_MIGRATION() << "Commiting in incompatible process for URL: "
+                              << process_lock.lock_url() << " lock vs "
+                              << common_params->url.DeprecatedGetOriginAsURL();
     base::debug::DumpWithoutCrashing();
   }
 
@@ -11778,7 +11779,7 @@
     case LifecycleStateImpl::kSpeculative:
       // TODO(crbug.com/40171294): Ensure that Speculative
       // RenderFrameHosts are not exposed to embedders.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return LifecycleState::kPendingCommit;
     case LifecycleStateImpl::kPendingCommit:
       return LifecycleState::kPendingCommit;
@@ -11842,7 +11843,8 @@
     return parent_->child_at(i + relative_offset);
   }
 
-  NOTREACHED() << "FrameTreeNode not found in its parent's children.";
+  NOTREACHED_IN_MIGRATION()
+      << "FrameTreeNode not found in its parent's children.";
   return nullptr;
 }
 
@@ -16613,7 +16615,7 @@
     return;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   base::debug::DumpWithoutCrashing();
 }
 
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc
index 2453fe68..068b15e 100644
--- a/content/browser/renderer_host/render_frame_host_manager.cc
+++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -1891,11 +1891,11 @@
                             frame_tree_node_->IsMainFrame());
       SCOPED_CRASH_KEY_BOOL("GetFrameHostForNav", "use_current_rfh",
                             use_current_rfh);
-      NOTREACHED() << "Picked an incompatible process for origin: "
-                   << process_lock.ToString() << " lock vs "
-                   << origin_to_commit.GetDebugString()
-                   << ", request_is_sandboxed = "
-                   << request->GetUrlInfo().is_sandboxed;
+      NOTREACHED_IN_MIGRATION()
+          << "Picked an incompatible process for origin: "
+          << process_lock.ToString() << " lock vs "
+          << origin_to_commit.GetDebugString()
+          << ", request_is_sandboxed = " << request->GetUrlInfo().is_sandboxed;
       base::debug::DumpWithoutCrashing();
     }
   }
@@ -2956,7 +2956,7 @@
   }
 
   if (!ReinitializeMainRenderFrame(render_frame_host_.get())) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return false;
   }
 
@@ -5303,7 +5303,7 @@
   if (current_frame_host()->HasPendingCommitNavigation() ||
       frame_tree_node_->navigation_request() ||
       speculative_render_frame_host_) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     base::debug::DumpWithoutCrashing();
     NotifyPrepareForInnerDelegateAttachComplete(false /* success */);
     return;
diff --git a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
index 9bdc6e3..fe53618 100644
--- a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
@@ -5479,7 +5479,7 @@
     if (event_name == "visibilitychange")
       return blink::mojom::SuddenTerminationDisablerType::
           kVisibilityChangeHandler;
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return blink::mojom::SuddenTerminationDisablerType::kUnloadHandler;
   }
 
@@ -5496,7 +5496,7 @@
     if (event_name == "visibilitychange") {
       return {"window", "document"};
     }
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return {};
   }
 
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 83defaa..07a00a4 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -610,7 +610,7 @@
         // the field that this is happening. We need to figure out why some
         // RenderProcessHosts are not taken out of the map when they're
         // destroyed.
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         continue;
       }
 
@@ -1517,8 +1517,9 @@
       return;
     }
     default:
-      NOTREACHED() << "There should be only one RenderProcessHost when running "
-                   << "in-process.";
+      NOTREACHED_IN_MIGRATION()
+          << "There should be only one RenderProcessHost when running "
+          << "in-process.";
   }
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc
index 4eef42f..6ebd363 100644
--- a/content/browser/renderer_host/render_widget_host_input_event_router.cc
+++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc
@@ -302,7 +302,7 @@
       break;
     case PinchState::NONE:
     case PinchState::EXISTING_BUBBLING_TO_ROOT:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 }
 
@@ -760,11 +760,12 @@
 
   switch (event->SourceDevice()) {
     case blink::WebGestureDevice::kUninitialized:
-      NOTREACHED() << "Uninitialized device type is not allowed";
+      NOTREACHED_IN_MIGRATION() << "Uninitialized device type is not allowed";
       break;
     case blink::WebGestureDevice::kSyntheticAutoscroll:
-      NOTREACHED() << "Only target_viewport synthetic autoscrolls are "
-                      "currently supported";
+      NOTREACHED_IN_MIGRATION()
+          << "Only target_viewport synthetic autoscrolls are "
+             "currently supported";
       break;
     case blink::WebGestureDevice::kTouchpad:
       RouteTouchpadGestureEvent(root_view, event, latency);
@@ -773,7 +774,7 @@
       RouteTouchscreenGestureEvent(root_view, event, latency);
       break;
     case blink::WebGestureDevice::kScrollbar:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "This gesture source is only ever generated inside the renderer "
              "and is designated for compositor threaded scrollbar scrolling. "
              "We should never see it in the browser.";
@@ -801,7 +802,7 @@
     default:
       // We'll only ever call this method for TouchStart, TouchEnd
       // and TounchCancel events, so mark the rest as not-reached.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   for (unsigned i = 0; i < event.touches_length; ++i) {
     if (event.touches[i].state == required_state)
@@ -876,8 +877,9 @@
 
   // Debugging for crbug.com/814674.
   if (touch_target_ && !IsViewInMap(touch_target_)) {
-    NOTREACHED() << "Touch events should not be routed to a destroyed target "
-                    "View.";
+    NOTREACHED_IN_MIGRATION()
+        << "Touch events should not be routed to a destroyed target "
+           "View.";
     touch_target_ = nullptr;
     base::debug::DumpWithoutCrashing();
   }
@@ -1278,7 +1280,7 @@
           ui::ScrollGranularity::kScrollByPrecisePixel;
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   view->ProcessGestureEvent(
       scroll_end,
@@ -1847,7 +1849,7 @@
       return FindTouchpadGestureEventTarget(root_view, gesture_event);
     }
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return RenderWidgetTargetResult();
 }
 
@@ -1924,7 +1926,7 @@
       return;
     }
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 TouchEmulator* RenderWidgetHostInputEventRouter::GetTouchEmulator() {
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 f8fa339..5504e37 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -1189,7 +1189,7 @@
 }
 
 void RenderWidgetHostViewAndroid::SetInsets(const gfx::Insets& insets) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 gfx::Size RenderWidgetHostViewAndroid::GetCompositorViewportPixelSize() {
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index df08c0e0..569f4a90 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -1200,7 +1200,7 @@
       break;
     default:
       required_state = blink::WebTouchPoint::State::kStateUndefined;
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 
@@ -2009,7 +2009,7 @@
 }
 
 void RenderWidgetHostViewAura::OnPaint(const ui::PaintContext& context) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void RenderWidgetHostViewAura::OnDeviceScaleFactorChanged(
@@ -2237,7 +2237,7 @@
   }
 
   if (window_ != lost_focus) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
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 60d2748..9243488 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.cc
+++ b/content/browser/renderer_host/render_widget_host_view_base.cc
@@ -145,7 +145,8 @@
         this, anchor_rect, anchor_dir, focus_rect, focus_dir, bounding_box,
         is_anchor_first);
 #else
-  NOTREACHED() << "Selection bounds should be routed through the compositor.";
+  NOTREACHED_IN_MIGRATION()
+      << "Selection bounds should be routed through the compositor.";
 #endif
 }
 
@@ -202,7 +203,7 @@
     return;
 
 #if BUILDFLAG(IS_ANDROID)
-  NOTREACHED()
+  NOTREACHED_IN_MIGRATION()
       << "RenderWidgetHostViewAndroid::CopyFromSurface calls "
          "DelegatedFrameHostAndroid::CopyFromCompositingSurface directly, "
          "and popups are not supported.";
@@ -462,18 +463,18 @@
       }
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 }
 
 bool RenderWidgetHostViewBase::HasFallbackSurface() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 viz::SurfaceId RenderWidgetHostViewBase::GetFallbackSurfaceIdForTesting()
     const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return viz::SurfaceId();
 }
 
@@ -813,7 +814,7 @@
     const gfx::PointF& point,
     RenderWidgetHostViewInput* target_view,
     gfx::PointF* transformed_point) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return true;
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_view_browsertest.cc b/content/browser/renderer_host/render_widget_host_view_browsertest.cc
index 526a67b..184fa2d 100644
--- a/content/browser/renderer_host/render_widget_host_view_browsertest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_browsertest.cc
@@ -1338,7 +1338,7 @@
         default:
           LOG(ERROR)
               << "Invalid readback response value: " << readback_result_;
-          NOTREACHED();
+          NOTREACHED_IN_MIGRATION();
       }
       // clang-format on
     } while (readback_result_ != READBACK_SUCCESS &&
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame.cc b/content/browser/renderer_host/render_widget_host_view_child_frame.cc
index eee00fb..8ead49ed 100644
--- a/content/browser/renderer_host/render_widget_host_view_child_frame.cc
+++ b/content/browser/renderer_host/render_widget_host_view_child_frame.cc
@@ -154,7 +154,7 @@
 std::unique_ptr<SyntheticGestureTarget>
 RenderWidgetHostViewChildFrame::CreateSyntheticGestureTarget() {
   // Sythetic gestures should be sent to the root view.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
@@ -168,7 +168,7 @@
 }
 
 void RenderWidgetHostViewChildFrame::InitAsChild(gfx::NativeView parent_view) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void RenderWidgetHostViewChildFrame::SetSize(const gfx::Size& size) {
@@ -299,7 +299,7 @@
 
 gfx::NativeViewAccessible
 RenderWidgetHostViewChildFrame::GetNativeViewAccessible() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
@@ -327,29 +327,29 @@
 
 std::optional<DisplayFeature>
 RenderWidgetHostViewChildFrame::GetDisplayFeature() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::nullopt;
 }
 
 void RenderWidgetHostViewChildFrame::SetDisplayFeatureForTesting(
     const DisplayFeature*) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void RenderWidgetHostViewChildFrame::NotifyHostAndDelegateOnWasShown(
     blink::mojom::RecordContentToVisibleTimeRequestPtr) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void RenderWidgetHostViewChildFrame::
     RequestSuccessfulPresentationTimeFromHostOrDelegate(
         blink::mojom::RecordContentToVisibleTimeRequestPtr) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void RenderWidgetHostViewChildFrame::
     CancelSuccessfulPresentationTimeRequestForHostAndDelegate() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 gfx::Size RenderWidgetHostViewChildFrame::GetCompositorViewportPixelSize() {
@@ -367,7 +367,7 @@
     RenderWidgetHostView* parent_host_view,
     const gfx::Rect& bounds,
     const gfx::Rect& anchor_rect) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void RenderWidgetHostViewChildFrame::UpdateCursor(const ui::Cursor& cursor) {
@@ -598,7 +598,7 @@
     blink::mojom::InputEventResultState ack_result) {
   // ACKs of synthetic wheel events for touchpad pinch or double tap are
   // processed in the root RWHV.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void RenderWidgetHostViewChildFrame::SetParentFrameSinkId(
@@ -633,7 +633,7 @@
     gfx::PointF* point) {
   // This function is called by RenderWidgetHostInputEventRouter only for
   // root-views.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return;
 }
 
@@ -868,7 +868,7 @@
 void RenderWidgetHostViewChildFrame::
     InvalidateLocalSurfaceIdAndAllocationGroup() {
   // This should only be handled by the top frame.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 #if BUILDFLAG(IS_MAC)
@@ -1003,7 +1003,7 @@
     if (gesture_event.SourceDevice() == blink::WebGestureDevice::kTouchscreen) {
       return blink::mojom::InputEventResultState::kConsumed;
     }
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   if (input_event.GetType() == blink::WebInputEvent::Type::kGestureFlingStart) {
diff --git a/content/browser/renderer_host/scroll_into_view_browsertest.cc b/content/browser/renderer_host/scroll_into_view_browsertest.cc
index 296c2ba..0f367be6 100644
--- a/content/browser/renderer_host/scroll_into_view_browsertest.cc
+++ b/content/browser/renderer_host/scroll_into_view_browsertest.cc
@@ -436,7 +436,7 @@
     root_view->SetLastPointerType(ui::EventPointerType::kTouch);
     root_view->SetInsets(gfx::Insets::TLBR(0, 0, keyboard_height, 0));
 #else
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 #endif
   }
 
diff --git a/content/browser/renderer_host/text_input_manager.cc b/content/browser/renderer_host/text_input_manager.cc
index ac57c08..96af80ef 100644
--- a/content/browser/renderer_host/text_input_manager.cc
+++ b/content/browser/renderer_host/text_input_manager.cc
@@ -35,7 +35,7 @@
   // the state. So the new state is always different.
   return true;
 #else
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return true;
 #endif
 }
diff --git a/content/browser/renderer_host/ui_events_helper.cc b/content/browser/renderer_host/ui_events_helper.cc
index ad16bd5..0fc26a9 100644
--- a/content/browser/renderer_host/ui_events_helper.cc
+++ b/content/browser/renderer_host/ui_events_helper.cc
@@ -61,7 +61,7 @@
       type = ui::ET_TOUCH_CANCELLED;
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return false;
   }
 
diff --git a/content/browser/renderer_host/view_transition_commit_deferring_condition.cc b/content/browser/renderer_host/view_transition_commit_deferring_condition.cc
index 0171fcd7a..bfa8855 100644
--- a/content/browser/renderer_host/view_transition_commit_deferring_condition.cc
+++ b/content/browser/renderer_host/view_transition_commit_deferring_condition.cc
@@ -108,7 +108,7 @@
     case blink::mojom::NavigationType::HISTORY_SAME_DOCUMENT:
       // Same document navigations should already be excluded by
       // `ShouldDispatchPageSwapEvent`.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   return base::WrapUnique(
diff --git a/content/browser/sandbox_ipc_linux.cc b/content/browser/sandbox_ipc_linux.cc
index b9ed8db8..7cd8fa94 100644
--- a/content/browser/sandbox_ipc_linux.cc
+++ b/content/browser/sandbox_ipc_linux.cc
@@ -95,11 +95,11 @@
   if (len == -1) {
     // TODO: should send an error reply, or the sender might block forever.
     if (errno == EMSGSIZE) {
-      NOTREACHED() << "Sandbox host message is larger than "
-                      "kMaxSandboxIPCMessagePayloadSize";
+      NOTREACHED_IN_MIGRATION() << "Sandbox host message is larger than "
+                                   "kMaxSandboxIPCMessagePayloadSize";
     } else {
       PLOG(ERROR) << "Recvmsg failed";
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
     return;
   }
@@ -124,7 +124,7 @@
     HandleMakeSharedMemorySegment(fd, iter, fds);
     return;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void SandboxIPCHandler::HandleMakeSharedMemorySegment(
diff --git a/content/browser/scheduler/browser_task_executor.cc b/content/browser/scheduler/browser_task_executor.cc
index 68b69f5..e8283fc3 100644
--- a/content/browser/scheduler/browser_task_executor.cc
+++ b/content/browser/scheduler/browser_task_executor.cc
@@ -52,7 +52,7 @@
       traits = {base::TaskPriority::USER_BLOCKING};
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return g_browser_task_executor->GetUIThreadTaskRunner(traits);
 }
@@ -76,7 +76,7 @@
     case BrowserThread::IO:
       return browser_io_thread_handle_->GetBrowserTaskRunner(queue_type);
     case BrowserThread::ID_COUNT:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return nullptr;
 }
@@ -243,7 +243,7 @@
       break;
     }
     case BrowserThread::ID_COUNT:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   run_loop.Run();
diff --git a/content/browser/scheduler/browser_task_priority.cc b/content/browser/scheduler/browser_task_priority.cc
index 4212dba2e..35e646e 100644
--- a/content/browser/scheduler/browser_task_priority.cc
+++ b/content/browser/scheduler/browser_task_priority.cc
@@ -29,7 +29,7 @@
     case BrowserTaskPriority::kBestEffortPriority:
       return ProtoPriority::BEST_EFFORT_PRIORITY;
     case BrowserTaskPriority::kPriorityCount:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return ProtoPriority::UNKNOWN;
   }
 }
diff --git a/content/browser/scheduler/browser_task_queues.cc b/content/browser/scheduler/browser_task_queues.cc
index d338bde7..abb13bd 100644
--- a/content/browser/scheduler/browser_task_queues.cc
+++ b/content/browser/scheduler/browser_task_queues.cc
@@ -44,7 +44,7 @@
     case BrowserThread::ID_COUNT:
       break;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return QueueName::UNKNOWN_TQ;
 }
 
@@ -57,7 +57,7 @@
     case BrowserThread::ID_COUNT:
       break;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return QueueName::UNKNOWN_TQ;
 }
 
@@ -117,7 +117,7 @@
     case BrowserThread::ID_COUNT:
       break;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return QueueName::UNKNOWN_TQ;
 }
 
diff --git a/content/browser/scheduler/browser_ui_thread_scheduler.cc b/content/browser/scheduler/browser_ui_thread_scheduler.cc
index 3e9b950c..6c57f623 100644
--- a/content/browser/scheduler/browser_ui_thread_scheduler.cc
+++ b/content/browser/scheduler/browser_ui_thread_scheduler.cc
@@ -237,7 +237,7 @@
     case BrowserTaskQueues::QueueType::kBeforeUnloadBrowserResponse:
       return true;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void BrowserUIThreadScheduler::DidEndUserInput() {
diff --git a/content/browser/screen_orientation/screen_orientation_provider.cc b/content/browser/screen_orientation/screen_orientation_provider.cc
index db9f421..15963958 100644
--- a/content/browser/screen_orientation/screen_orientation_provider.cc
+++ b/content/browser/screen_orientation/screen_orientation_provider.cc
@@ -217,7 +217,7 @@
       break;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return device::mojom::ScreenOrientationLockType::DEFAULT;
 }
 
@@ -232,7 +232,7 @@
 
   if (lock == device::mojom::ScreenOrientationLockType::NATURAL ||
       lock == device::mojom::ScreenOrientationLockType::DEFAULT) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   return LockMatchesOrientation(lock, screen_info.orientation_type);
 }
diff --git a/content/browser/screenlock_monitor/screenlock_monitor_device_source_lacros_unittest.cc b/content/browser/screenlock_monitor/screenlock_monitor_device_source_lacros_unittest.cc
index cb5fc55..6ced8711 100644
--- a/content/browser/screenlock_monitor/screenlock_monitor_device_source_lacros_unittest.cc
+++ b/content/browser/screenlock_monitor/screenlock_monitor_device_source_lacros_unittest.cc
@@ -87,7 +87,7 @@
     mojo::FusePipes(std::move(observer_pending_receiver_), std::move(observer));
   }
   void GetSessionState(GetSessionStateCallback callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void SetSessionStateAndNotify(crosapi::mojom::SessionState state) {
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc
index 2ba41a8e..28cd653 100644
--- a/content/browser/service_worker/embedded_worker_instance.cc
+++ b/content/browser/service_worker/embedded_worker_instance.cc
@@ -94,7 +94,7 @@
     case EmbeddedWorkerInstance::SCRIPT_EVALUATION:
       return true;
     case EmbeddedWorkerInstance::STARTING_PHASE_MAX_VALUE:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return false;
 }
@@ -1040,7 +1040,7 @@
     case blink::EmbeddedWorkerStatus::kStopping:
       return "STOPPING";
   }
-  NOTREACHED() << static_cast<int>(status);
+  NOTREACHED_IN_MIGRATION() << static_cast<int>(status);
   return std::string();
 }
 
@@ -1062,9 +1062,9 @@
     case SCRIPT_EVALUATION:
       return "Script evaluation";
     case STARTING_PHASE_MAX_VALUE:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
-  NOTREACHED() << phase;
+  NOTREACHED_IN_MIGRATION() << phase;
   return std::string();
 }
 
diff --git a/content/browser/service_worker/fake_embedded_worker_instance_client.cc b/content/browser/service_worker/fake_embedded_worker_instance_client.cc
index ae0bce1..d068c8f 100644
--- a/content/browser/service_worker/fake_embedded_worker_instance_client.cc
+++ b/content/browser/service_worker/fake_embedded_worker_instance_client.cc
@@ -307,7 +307,7 @@
       break;
     case State::kCompleted:
     case State::kBlocked:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   if (quit_closure_for_start_worker_)
@@ -328,7 +328,7 @@
       stop_state_ = State::kBlocked;
       break;
     case State::kCompleted:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   if (quit_closure_for_stop_worker_)
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index 56c05eb..bab7619 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -2324,7 +2324,7 @@
           return "03DCAF85CA3E2B73158B9C43FAC7086BAA6AE9B83B503E389F4323660F58D"
                  "D09";
         }
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return "";
       case ServiceWorkerScriptImportType::kStaticImport:
         if (before_script_update) {
@@ -2341,7 +2341,7 @@
           return "3E6C3E5F3C40F87B69D1913FD7201760BD3C8824026837D4BFB4828811F60"
                  "3D7";
         }
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return "";
     }
   }
@@ -2763,15 +2763,15 @@
       mojo::PendingReceiver<blink::mojom::CacheStorage> receiver) override {
     // The CodeCacheHostImpl should not try to add a receiver if the StorageKey
     // is bad.
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   void AddObserver(mojo::PendingRemote<storage::mojom::CacheStorageObserver>
                        observer) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   void ApplyPolicyUpdates(std::vector<storage::mojom::StoragePolicyUpdatePtr>
                               policy_updates) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 };
 
@@ -4725,7 +4725,7 @@
       run_loop.RunUntilIdle();
     }
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/service_worker/service_worker_cache_writer.cc b/content/browser/service_worker/service_worker_cache_writer.cc
index 303ce77..2bb6d0f 100644
--- a/content/browser/service_worker/service_worker_cache_writer.cc
+++ b/content/browser/service_worker/service_worker_cache_writer.cc
@@ -151,7 +151,7 @@
         status = DoDone(status);
         break;
       default:
-        NOTREACHED() << "Unknown state in DoLoop";
+        NOTREACHED_IN_MIGRATION() << "Unknown state in DoLoop";
         state_ = STATE_DONE;
         break;
     }
diff --git a/content/browser/service_worker/service_worker_container_host.cc b/content/browser/service_worker/service_worker_container_host.cc
index 4b8daab..2fdd3b35 100644
--- a/content/browser/service_worker/service_worker_container_host.cc
+++ b/content/browser/service_worker/service_worker_container_host.cc
@@ -54,7 +54,7 @@
     case blink::mojom::ControllerServiceWorkerPurpose::FETCH_SUB_RESOURCE:
       return ServiceWorkerMetrics::EventType::FETCH_SUB_RESOURCE;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return ServiceWorkerMetrics::EventType::UNKNOWN;
 }
 
@@ -1608,7 +1608,7 @@
       DCHECK_EQ(new_phase, ClientPhase::kExecutionReady);
       break;
     case ClientPhase::kExecutionReady:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   client_phase_ = new_phase;
@@ -2315,7 +2315,7 @@
 
     // Web workers don't yet have access to ServiceWorker objects, so they
     // can't postMessage to one (https://crbug.com/371690).
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index 79ffd4b3..8be9bc26 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -437,7 +437,7 @@
       blink::mojom::ServiceWorkerFetchEventTimingPtr timing) {
     if (!version->FinishRequest(fetch_event_id.value(),
                                 fetch_result == FetchEventResult::kGotResponse))
-      NOTREACHED() << "Should only receive one reply per event";
+      NOTREACHED_IN_MIGRATION() << "Should only receive one reply per event";
     // |fetch_dispatcher| is null if the URLRequest was killed.
     if (!fetch_dispatcher)
       return;
@@ -748,8 +748,8 @@
     case ServiceWorkerFetchDispatcher::FetchEventResult::kGotResponse:
       return "_GOT_RESPONSE";
   }
-  NOTREACHED() << "Got unexpected fetch event result:"
-               << static_cast<int>(result);
+  NOTREACHED_IN_MIGRATION()
+      << "Got unexpected fetch event result:" << static_cast<int>(result);
   return "error";
 }
 
diff --git a/content/browser/service_worker/service_worker_installed_script_loader.cc b/content/browser/service_worker/service_worker_installed_script_loader.cc
index 88c4437f..bf5ece8 100644
--- a/content/browser/service_worker/service_worker_installed_script_loader.cc
+++ b/content/browser/service_worker/service_worker_installed_script_loader.cc
@@ -96,7 +96,7 @@
       net_error = net::ERR_FAILED;
       break;
     case FinishedReason::kNotFinished:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   client_->OnComplete(network::URLLoaderCompletionStatus(net_error));
@@ -109,7 +109,7 @@
     const std::optional<GURL>& new_url) {
   // This class never returns a redirect response to its client, so should never
   // be asked to follow one.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ServiceWorkerInstalledScriptLoader::SetPriority(
diff --git a/content/browser/service_worker/service_worker_installed_script_reader.cc b/content/browser/service_worker/service_worker_installed_script_reader.cc
index c6d07c9..6287a6d8 100644
--- a/content/browser/service_worker/service_worker_installed_script_reader.cc
+++ b/content/browser/service_worker/service_worker_installed_script_reader.cc
@@ -50,7 +50,7 @@
       case MOJO_RESULT_INVALID_ARGUMENT:
       case MOJO_RESULT_OUT_OF_RANGE:
       case MOJO_RESULT_BUSY:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return;
       case MOJO_RESULT_FAILED_PRECONDITION:
         OnCompleted(false);
diff --git a/content/browser/service_worker/service_worker_installed_scripts_sender.cc b/content/browser/service_worker/service_worker_installed_scripts_sender.cc
index 1370f390..e00f037 100644
--- a/content/browser/service_worker/service_worker_installed_scripts_sender.cc
+++ b/content/browser/service_worker/service_worker_installed_scripts_sender.cc
@@ -187,7 +187,7 @@
   switch (reason) {
     case ServiceWorkerInstalledScriptReader::FinishedReason::kNotFinished:
     case ServiceWorkerInstalledScriptReader::FinishedReason::kSuccess:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return;
     case ServiceWorkerInstalledScriptReader::FinishedReason::
         kNoResponseHeadError:
diff --git a/content/browser/service_worker/service_worker_loader_helpers.cc b/content/browser/service_worker/service_worker_loader_helpers.cc
index 378c0d4..3e4dd18 100644
--- a/content/browser/service_worker/service_worker_loader_helpers.cc
+++ b/content/browser/service_worker/service_worker_loader_helpers.cc
@@ -156,7 +156,7 @@
     case blink::mojom::ServiceWorkerUpdateViaCache::kAll:
       return false;
   }
-  NOTREACHED() << static_cast<int>(cache_mode);
+  NOTREACHED_IN_MIGRATION() << static_cast<int>(cache_mode);
   return false;
 }
 
diff --git a/content/browser/service_worker/service_worker_main_resource_loader.cc b/content/browser/service_worker/service_worker_main_resource_loader.cc
index 746b3404..6751d29 100644
--- a/content/browser/service_worker/service_worker_main_resource_loader.cc
+++ b/content/browser/service_worker/service_worker_main_resource_loader.cc
@@ -657,7 +657,7 @@
       case FetchResponseFrom::kNoResponseYet:
       case FetchResponseFrom::kSubresourceLoaderIsHandlingRedirect:
       case FetchResponseFrom::kAutoPreloadHandlingFallback:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
       case FetchResponseFrom::kServiceWorker:
         RecordTimingMetricsForFetchHandlerHandledCase();
@@ -1548,7 +1548,7 @@
 #if DCHECK_IS_ON()
   switch (new_status) {
     case Status::kNotStarted:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     case Status::kStarted:
       DCHECK_EQ(status_, Status::kNotStarted);
diff --git a/content/browser/service_worker/service_worker_metrics.cc b/content/browser/service_worker/service_worker_metrics.cc
index 2e8212b4..0fdae7c 100644
--- a/content/browser/service_worker/service_worker_metrics.cc
+++ b/content/browser/service_worker/service_worker_metrics.cc
@@ -29,7 +29,7 @@
   // logs.
   switch (situation) {
     case ServiceWorkerMetrics::StartSituation::UNKNOWN:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return ".Unknown";
     case ServiceWorkerMetrics::StartSituation::DURING_STARTUP:
       return ".DuringStartup";
@@ -40,7 +40,7 @@
     case ServiceWorkerMetrics::StartSituation::EXISTING_READY_PROCESS:
       return ".ExistingReadyProcess";
   }
-  NOTREACHED() << static_cast<int>(situation);
+  NOTREACHED_IN_MIGRATION() << static_cast<int>(situation);
   return ".Unknown";
 }
 
@@ -51,7 +51,7 @@
   // logs.
   switch (situation) {
     case ServiceWorkerMetrics::StartSituation::UNKNOWN:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "_Unknown";
     case ServiceWorkerMetrics::StartSituation::DURING_STARTUP:
       return "_DuringStartup";
@@ -62,7 +62,7 @@
     case ServiceWorkerMetrics::StartSituation::EXISTING_READY_PROCESS:
       return "_ExistingReadyProcess";
   }
-  NOTREACHED() << static_cast<int>(situation);
+  NOTREACHED_IN_MIGRATION() << static_cast<int>(situation);
   return "_Unknown";
 }
 
@@ -209,7 +209,8 @@
     case ServiceWorkerMetrics::EventType::STATIC_ROUTER:
       return "Static Routing";
   }
-  NOTREACHED() << "Got unexpected event type: " << static_cast<int>(event_type);
+  NOTREACHED_IN_MIGRATION()
+      << "Got unexpected event type: " << static_cast<int>(event_type);
   return "error";
 }
 
@@ -227,8 +228,8 @@
     case StartSituation::EXISTING_READY_PROCESS:
       return "Existing ready process";
   }
-  NOTREACHED() << "Got unexpected start situation: "
-               << static_cast<int>(start_situation);
+  NOTREACHED_IN_MIGRATION() << "Got unexpected start situation: "
+                            << static_cast<int>(start_situation);
   return "error";
 }
 
@@ -397,7 +398,7 @@
     case EventType::STATIC_ROUTER:
     // Static Routing should not be sent as an event.
     case EventType::UNKNOWN:
-      NOTREACHED() << "Invalid event type";
+      NOTREACHED_IN_MIGRATION() << "Invalid event type";
       break;
   }
 }
diff --git a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
index 4922ba5..c57115a 100644
--- a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
@@ -415,7 +415,7 @@
 
   void Clone(mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver)
       override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   mojo::ScopedDataPipeProducerHandle body_producer_;
diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc
index e36d28f9b..17bfa7e 100644
--- a/content/browser/service_worker/service_worker_register_job.cc
+++ b/content/browser/service_worker/service_worker_register_job.cc
@@ -229,7 +229,7 @@
 void ServiceWorkerRegisterJob::SetPhase(Phase phase) {
   switch (phase) {
     case INITIAL:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     case START:
       DCHECK(phase_ == INITIAL) << phase_;
diff --git a/content/browser/service_worker/service_worker_registration.cc b/content/browser/service_worker/service_worker_registration.cc
index 4671755c..0b3f04a 100644
--- a/content/browser/service_worker/service_worker_registration.cc
+++ b/content/browser/service_worker/service_worker_registration.cc
@@ -115,7 +115,7 @@
       // - To kUninstalled: finished uninstalling.
       break;
     case Status::kUninstalled:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 #endif  // DCHECK_IS_ON()
@@ -389,7 +389,7 @@
     case Status::kUninstalling:
       break;
     case Status::kUninstalled:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "attempt to resurrect a completely uninstalled registration";
       break;
   }
diff --git a/content/browser/service_worker/service_worker_registration_unittest.cc b/content/browser/service_worker/service_worker_registration_unittest.cc
index 6897b13..b6c1eaf8 100644
--- a/content/browser/service_worker/service_worker_registration_unittest.cc
+++ b/content/browser/service_worker/service_worker_registration_unittest.cc
@@ -210,11 +210,11 @@
 
     void OnRegistrationFailed(
         ServiceWorkerRegistration* registration) override {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
 
     void OnUpdateFound(ServiceWorkerRegistration* registration) override {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
 
     void Reset() {
diff --git a/content/browser/service_worker/service_worker_registry.cc b/content/browser/service_worker/service_worker_registry.cc
index f2c2e4b7..9001569 100644
--- a/content/browser/service_worker/service_worker_registry.cc
+++ b/content/browser/service_worker/service_worker_registry.cc
@@ -1139,7 +1139,7 @@
   else if (version->status() == ServiceWorkerVersion::INSTALLED)
     registration->SetWaitingVersion(version);
   else
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 
   registration->EnableNavigationPreload(data.navigation_preload_state->enabled);
   registration->SetNavigationPreloadHeader(
diff --git a/content/browser/service_worker/service_worker_script_loader_factory.cc b/content/browser/service_worker/service_worker_script_loader_factory.cc
index 87a07b9..ea95837 100644
--- a/content/browser/service_worker/service_worker_script_loader_factory.cc
+++ b/content/browser/service_worker/service_worker_script_loader_factory.cc
@@ -128,7 +128,7 @@
         case ServiceWorkerSingleScriptUpdateChecker::Result::kNotCompared:
           // This is invalid, as scripts in compared script info must have been
           // compared.
-          NOTREACHED();
+          NOTREACHED_IN_MIGRATION();
           return;
       }
     }
diff --git a/content/browser/service_worker/service_worker_single_script_update_checker.cc b/content/browser/service_worker/service_worker_single_script_update_checker.cc
index bec7d105..39ccd54 100644
--- a/content/browser/service_worker/service_worker_single_script_update_checker.cc
+++ b/content/browser/service_worker/service_worker_single_script_update_checker.cc
@@ -309,7 +309,7 @@
     int64_t total_size,
     OnUploadProgressCallback ack_callback) {
   // The network request for update checking shouldn't have upload data.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ServiceWorkerSingleScriptUpdateChecker::OnTransferSizeUpdated(
@@ -350,7 +350,7 @@
         ServiceWorkerUpdatedScriptLoader::WriterState::kCompleted;
     switch (header_writer_state_) {
       case ServiceWorkerUpdatedScriptLoader::WriterState::kNotStarted:
-        NOTREACHED()
+        NOTREACHED_IN_MIGRATION()
             << "Response header should be received before OnComplete()";
         break;
       case ServiceWorkerUpdatedScriptLoader::WriterState::kWriting:
@@ -547,7 +547,7 @@
       network_watcher_.ArmOrNotify();
       return;
   }
-  NOTREACHED() << static_cast<int>(result);
+  NOTREACHED_IN_MIGRATION() << static_cast<int>(result);
 }
 
 // |pending_buffer| is a buffer keeping a Mojo data pipe which is going to be
diff --git a/content/browser/service_worker/service_worker_test_utils.cc b/content/browser/service_worker/service_worker_test_utils.cc
index c0b9a13..d2d659a 100644
--- a/content/browser/service_worker/service_worker_test_utils.cc
+++ b/content/browser/service_worker/service_worker_test_utils.cc
@@ -965,7 +965,7 @@
     switch (rv) {
       case MOJO_RESULT_BUSY:
       case MOJO_RESULT_INVALID_ARGUMENT:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return;
       case MOJO_RESULT_FAILED_PRECONDITION:
         std::move(quit_closure).Run();
@@ -987,7 +987,7 @@
         break;
     }
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return;
 }
 
diff --git a/content/browser/service_worker/service_worker_type_converters.cc b/content/browser/service_worker/service_worker_type_converters.cc
index b13ceb5..33e2ea5 100644
--- a/content/browser/service_worker/service_worker_type_converters.cc
+++ b/content/browser/service_worker/service_worker_type_converters.cc
@@ -29,7 +29,7 @@
     case content::ServiceWorkerVersion::REDUNDANT:
       return blink::mojom::ServiceWorkerState::kRedundant;
   }
-  NOTREACHED() << status;
+  NOTREACHED_IN_MIGRATION() << status;
   return blink::mojom::ServiceWorkerState::kParsed;
 }
 
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index 314c1a33..75a98dd 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -97,7 +97,8 @@
       version->running_status() != blink::EmbeddedWorkerStatus::kRunning) {
     // We've tried to start the worker (and it has succeeded), but
     // it looks it's not running yet.
-    NOTREACHED() << "The worker's not running after successful StartWorker";
+    NOTREACHED_IN_MIGRATION()
+        << "The worker's not running after successful StartWorker";
     std::move(callback).Run(
         blink::ServiceWorkerStatusCode::kErrorStartWorkerFailed);
     return;
@@ -391,7 +392,7 @@
     switch (status_) {
       case NEW:
         // |skip_waiting_| should not be set before the version is NEW.
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return;
       case INSTALLING:
         // Do nothing until INSTALLED time.
@@ -622,7 +623,7 @@
       RunSoon(std::move(callback));
       return;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ServiceWorkerVersion::TriggerIdleTerminationAsap() {
@@ -2087,7 +2088,7 @@
     case ServiceWorkerVersion::ACTIVATED:
       return true;
   }
-  NOTREACHED() << "Unexpected status: " << status;
+  NOTREACHED_IN_MIGRATION() << "Unexpected status: " << status;
   return false;
 }
 
@@ -2108,7 +2109,7 @@
     case ServiceWorkerVersion::REDUNDANT:
       return "redundant";
   }
-  NOTREACHED() << status;
+  NOTREACHED_IN_MIGRATION() << status;
   return std::string();
 }
 
@@ -3161,7 +3162,7 @@
     case ServiceWorkerVersion::FetchHandlerExistence::UNKNOWN:
       // UNKNOWN means the controller is still installing. It's not possible to
       // have a controller that hasn't finished installing.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return blink::mojom::ControllerServiceWorkerMode::kNoController;
   }
 }
diff --git a/content/browser/service_worker/url_loader_client_checker.cc b/content/browser/service_worker/url_loader_client_checker.cc
index 0b1eb88..d50b807 100644
--- a/content/browser/service_worker/url_loader_client_checker.cc
+++ b/content/browser/service_worker/url_loader_client_checker.cc
@@ -37,7 +37,7 @@
 NOINLINE void URLLoaderClientCheckedRemote::Proxy::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   if (status.error_code == net::OK && !on_receive_response_called_) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     base::debug::DumpWithoutCrashing();
     NO_CODE_FOLDING();
   }
diff --git a/content/browser/shared_storage/shared_storage_header_observer.cc b/content/browser/shared_storage/shared_storage_header_observer.cc
index 2cd5254..86a5272a 100644
--- a/content/browser/shared_storage/shared_storage_header_observer.cc
+++ b/content/browser/shared_storage/shared_storage_header_observer.cc
@@ -287,7 +287,7 @@
     case OperationType::kClear:
       return Clear(request_origin, main_frame_id);
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return false;
 }
diff --git a/content/browser/shared_storage/shared_storage_url_loader_factory_proxy.cc b/content/browser/shared_storage/shared_storage_url_loader_factory_proxy.cc
index 70378b53ea..e601306 100644
--- a/content/browser/shared_storage/shared_storage_url_loader_factory_proxy.cc
+++ b/content/browser/shared_storage/shared_storage_url_loader_factory_proxy.cc
@@ -83,7 +83,7 @@
 
 void SharedStorageURLLoaderFactoryProxy::Clone(
     mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 }  // namespace content
diff --git a/content/browser/sms/sms_provider.cc b/content/browser/sms/sms_provider.cc
index 6482dc4..e0e00ec 100644
--- a/content/browser/sms/sms_provider.cc
+++ b/content/browser/sms/sms_provider.cc
@@ -87,7 +87,7 @@
       NotifyFailure(FailureType::kSmsNotParsed_kGURLNotValid);
       break;
     case SmsParsingStatus::kParsed:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 }
diff --git a/content/browser/sms/webotp_service.cc b/content/browser/sms/webotp_service.cc
index 6d91390..1f9ef25 100644
--- a/content/browser/sms/webotp_service.cc
+++ b/content/browser/sms/webotp_service.cc
@@ -88,7 +88,7 @@
     case SmsFetchFailureType::kCrossDeviceFailure:
       return Outcome::kCrossDeviceFailure;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return Outcome::kTimeout;
   }
 }
@@ -296,7 +296,7 @@
       CompleteRequest(SmsStatus::kBackendNotAvailable);
       return;
     case FailureType::kNoFailure:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   // Records Sms parsing failures.
diff --git a/content/browser/speech/fake_speech_recognition_manager_delegate.cc b/content/browser/speech/fake_speech_recognition_manager_delegate.cc
index 05475da..19eba59 100644
--- a/content/browser/speech/fake_speech_recognition_manager_delegate.cc
+++ b/content/browser/speech/fake_speech_recognition_manager_delegate.cc
@@ -85,18 +85,18 @@
 void FakeSpeechRecognitionManagerDelegate::CheckRecognitionIsAllowed(
     int session_id,
     base::OnceCallback<void(bool ask_user, bool is_allowed)> callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 SpeechRecognitionEventListener*
 FakeSpeechRecognitionManagerDelegate::GetEventListener() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
 bool FakeSpeechRecognitionManagerDelegate::FilterProfanities(
     int render_process_id) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
diff --git a/content/browser/speech/network_speech_recognition_engine_impl.cc b/content/browser/speech/network_speech_recognition_engine_impl.cc
index 03811fb..65b5831 100644
--- a/content/browser/speech/network_speech_recognition_engine_impl.cc
+++ b/content/browser/speech/network_speech_recognition_engine_impl.cc
@@ -698,8 +698,8 @@
 NetworkSpeechRecognitionEngineImpl::FSMState
 NetworkSpeechRecognitionEngineImpl::NotFeasible(
     const FSMEventArgs& event_args) {
-  NOTREACHED() << "Unfeasible event " << event_args.event << " in state "
-               << state_;
+  NOTREACHED_IN_MIGRATION()
+      << "Unfeasible event " << event_args.event << " in state " << state_;
   return state_;
 }
 
diff --git a/content/browser/speech/speech_recognition_manager_impl.cc b/content/browser/speech/speech_recognition_manager_impl.cc
index 36b3090..b2f2f6a 100644
--- a/content/browser/speech/speech_recognition_manager_impl.cc
+++ b/content/browser/speech/speech_recognition_manager_impl.cc
@@ -741,9 +741,9 @@
 
 void SpeechRecognitionManagerImpl::NotFeasible(const Session& session,
                                                FSMEvent event) {
-  NOTREACHED() << "Unfeasible event " << event
-               << " in state " << GetSessionState(session.id)
-               << " for session " << session.id;
+  NOTREACHED_IN_MIGRATION()
+      << "Unfeasible event " << event << " in state "
+      << GetSessionState(session.id) << " for session " << session.id;
 }
 
 int SpeechRecognitionManagerImpl::GetNextSessionID() {
diff --git a/content/browser/speech/speech_recognizer_impl.cc b/content/browser/speech/speech_recognizer_impl.cc
index 7aa1c85..9de2c19f 100644
--- a/content/browser/speech/speech_recognizer_impl.cc
+++ b/content/browser/speech/speech_recognizer_impl.cc
@@ -836,8 +836,8 @@
 
 SpeechRecognizerImpl::FSMState
 SpeechRecognizerImpl::NotFeasible(const FSMEventArgs& event_args) {
-  NOTREACHED() << "Unfeasible event " << event_args.event
-               << " in state " << state_;
+  NOTREACHED_IN_MIGRATION()
+      << "Unfeasible event " << event_args.event << " in state " << state_;
   return state_;
 }
 
diff --git a/content/browser/speech/tts_controller_impl.cc b/content/browser/speech/tts_controller_impl.cc
index 1f71b55..63bd7325 100644
--- a/content/browser/speech/tts_controller_impl.cc
+++ b/content/browser/speech/tts_controller_impl.cc
@@ -365,7 +365,7 @@
       metric = UMATextToSpeechEvent::RESUME;
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return;
   }
   UMA_HISTOGRAM_ENUMERATION("TextToSpeech.Event", metric,
@@ -384,7 +384,7 @@
   // browser becomes invalid, we need to stop
   RemoveUtteranceAndStopIfNeeded(utterance_id);
 #else
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 #endif
 }
 
diff --git a/content/browser/speech/tts_platform_impl.cc b/content/browser/speech/tts_platform_impl.cc
index 07b1e98..309c941 100644
--- a/content/browser/speech/tts_platform_impl.cc
+++ b/content/browser/speech/tts_platform_impl.cc
@@ -30,7 +30,7 @@
   // trying to do TTS on a platform where the content client implementation
   // is not provided, that's probably not intended. It's not important
   // if this is hit in something like a content-only unit test.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 #else
   return TtsPlatformImpl::GetInstance();
diff --git a/content/browser/theme_helper_mac.mm b/content/browser/theme_helper_mac.mm
index 8c10bbe..9cce3bdc 100644
--- a/content/browser/theme_helper_mac.mm
+++ b/content/browser/theme_helper_mac.mm
@@ -314,7 +314,7 @@
         values[i] = NSColorToSkColor(NSColor.selectedTextBackgroundColor);
         break;
       case blink::MacSystemColorID::kCount:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
   }
diff --git a/content/browser/tracing/background_tracing_config_impl.cc b/content/browser/tracing/background_tracing_config_impl.cc
index 296f7684..43da160 100644
--- a/content/browser/tracing/background_tracing_config_impl.cc
+++ b/content/browser/tracing/background_tracing_config_impl.cc
@@ -68,7 +68,7 @@
     case BackgroundTracingConfigImpl::CUSTOM_TRACE_CONFIG:
       return kConfigCustomConfig;
     case BackgroundTracingConfigImpl::CATEGORY_PRESET_UNSET:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "";
   }
 }
@@ -356,7 +356,7 @@
       return config;
     }
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return TraceConfig();
   }
 }
diff --git a/content/browser/tracing/startup_tracing_controller.cc b/content/browser/tracing/startup_tracing_controller.cc
index 58ad11f..26c0533 100644
--- a/content/browser/tracing/startup_tracing_controller.cc
+++ b/content/browser/tracing/startup_tracing_controller.cc
@@ -127,7 +127,8 @@
       OpenFile(output_file_);
       tracing_session_->Setup(trace_config, file_.TakePlatformFile());
 #else
-      NOTREACHED() << "Streaming to file is not supported on Windows yet";
+      NOTREACHED_IN_MIGRATION()
+          << "Streaming to file is not supported on Windows yet";
 #endif
     } else {
       tracing_session_->Setup(trace_config);
diff --git a/content/browser/tracing/tracing_controller_impl.cc b/content/browser/tracing/tracing_controller_impl.cc
index 56d8ae9..cecd08f0 100644
--- a/content/browser/tracing/tracing_controller_impl.cc
+++ b/content/browser/tracing/tracing_controller_impl.cc
@@ -136,7 +136,7 @@
       return "WIN_ROLLOVER_PROTECTED_TIME_GET_TIME";
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::string();
 }
 
diff --git a/content/browser/url_loader_factory_getter.cc b/content/browser/url_loader_factory_getter.cc
index 0a84f61..2f41959 100644
--- a/content/browser/url_loader_factory_getter.cc
+++ b/content/browser/url_loader_factory_getter.cc
@@ -100,8 +100,9 @@
 
   // SharedURLLoaderFactory implementation:
   std::unique_ptr<network::PendingSharedURLLoaderFactory> Clone() override {
-    NOTREACHED() << "This isn't supported. If you need a SharedURLLoaderFactory"
-                    " on the UI thread, get it from StoragePartition.";
+    NOTREACHED_IN_MIGRATION()
+        << "This isn't supported. If you need a SharedURLLoaderFactory"
+           " on the UI thread, get it from StoragePartition.";
     return nullptr;
   }
 
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc
index 4d28d236..c3b2641d 100644
--- a/content/browser/utility_process_host.cc
+++ b/content/browser/utility_process_host.cc
@@ -284,7 +284,7 @@
 
     base::FilePath exe_path = ChildProcessHost::GetChildPath(child_flags);
     if (exe_path.empty()) {
-      NOTREACHED() << "Unable to get utility process binary name.";
+      NOTREACHED_IN_MIGRATION() << "Unable to get utility process binary name.";
       return false;
     }
 
diff --git a/content/browser/utility_process_host_browsertest.cc b/content/browser/utility_process_host_browsertest.cc
index 96a131d..12ccab67 100644
--- a/content/browser/utility_process_host_browsertest.cc
+++ b/content/browser/utility_process_host_browsertest.cc
@@ -100,7 +100,7 @@
     host_->SetSandboxType(
         sandbox::mojom::Sandbox::kNoSandboxAndElevatedPrivileges);
 #else
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 #endif
   }
 
diff --git a/content/browser/utility_process_sandbox_browsertest.cc b/content/browser/utility_process_sandbox_browsertest.cc
index 81fad10..919211ad 100644
--- a/content/browser/utility_process_sandbox_browsertest.cc
+++ b/content/browser/utility_process_sandbox_browsertest.cc
@@ -156,7 +156,7 @@
       case Sandbox::kGpu:
       case Sandbox::kRenderer:
       case Sandbox::kZygoteIntermediateSandbox:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
 
diff --git a/content/browser/web_contents/aura/gesture_nav_simple.cc b/content/browser/web_contents/aura/gesture_nav_simple.cc
index 597d588..a3a0a4c4 100644
--- a/content/browser/web_contents/aura/gesture_nav_simple.cc
+++ b/content/browser/web_contents/aura/gesture_nav_simple.cc
@@ -430,7 +430,7 @@
 void Affordance::AnimationProgressed(const gfx::Animation* animation) {
   switch (state_) {
     case State::DRAGGING:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     case State::ABORTING:
       SetAbortProgress(animation->GetCurrentValue());
@@ -442,7 +442,7 @@
 }
 
 void Affordance::AnimationCanceled(const gfx::Animation* animation) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 GestureNavSimple::GestureNavSimple(WebContentsImpl* web_contents)
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 6535215..9d62a6bf 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -961,7 +961,7 @@
     }
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
@@ -1103,7 +1103,7 @@
             << "WebContents (for more info see https://crbug.com/1376879#c44); "
             << "creator = " << creator;
       } else {
-        NOTREACHED()
+        NOTREACHED_IN_MIGRATION()
             << "BrowserContext is getting destroyed without first closing all "
             << "WebContents (for more info see https://crbug.com/1376879#c44); "
             << "creator = " << creator;
@@ -2532,11 +2532,11 @@
     case base::TERMINATION_STATUS_STILL_RUNNING:
       return false;
     case base::TERMINATION_STATUS_MAX_ENUM:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return false;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -3146,7 +3146,7 @@
     prefs.autoplay_policy =
         blink::mojom::AutoplayPolicy::kDocumentUserActivationRequired;
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   prefs.dont_send_key_events_to_javascript =
@@ -3667,7 +3667,7 @@
     pending_contents_.erase(iter);
     return;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void WebContentsImpl::OnRenderWidgetHostDestroyed(
@@ -4480,7 +4480,7 @@
                         "esc_key_locked", esc_key_locked);
   DCHECK(render_widget_host);
   if (WebContentsImpl::FromRenderWidgetHostImpl(render_widget_host) != this) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return false;
   }
 
@@ -6173,7 +6173,7 @@
   }
   if (WebContentsImpl::FromRenderWidgetHostImpl(keyboard_lock_widget_) !=
       this) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return false;
   }
   // KeyboardLock is only supported when called by the top-level browsing
@@ -6284,7 +6284,7 @@
   OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::Find");
   // Cowardly refuse to search for no text.
   if (search_text.empty()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
@@ -9555,7 +9555,7 @@
   return view_android->bounds().size();
 #elif BUILDFLAG(IS_IOS)
   // TODO(crbug.com/40254930): Implement me.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return gfx::Size();
 #endif
 }
diff --git a/content/browser/web_contents/web_contents_view_child_frame.cc b/content/browser/web_contents/web_contents_view_child_frame.cc
index 5ab6219c..1efd950 100644
--- a/content/browser/web_contents/web_contents_view_child_frame.cc
+++ b/content/browser/web_contents/web_contents_view_child_frame.cc
@@ -102,11 +102,11 @@
 }
 
 void WebContentsViewChildFrame::SetInitialFocus() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 gfx::Rect WebContentsViewChildFrame::GetViewBounds() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return gfx::Rect();
 }
 
@@ -158,28 +158,28 @@
 }
 
 void WebContentsViewChildFrame::RestoreFocus() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void WebContentsViewChildFrame::Focus() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void WebContentsViewChildFrame::StoreFocus() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void WebContentsViewChildFrame::FocusThroughTabTraversal(bool reverse) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 DropData* WebContentsViewChildFrame::GetDropData() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
 void WebContentsViewChildFrame::TransferDragSecurityInfo(WebContentsView*) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void WebContentsViewChildFrame::UpdateDragOperation(
@@ -192,19 +192,19 @@
 
 void WebContentsViewChildFrame::GotFocus(
     RenderWidgetHostImpl* render_widget_host) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void WebContentsViewChildFrame::TakeFocus(bool reverse) {
   // This is handled in RenderFrameHostImpl::TakeFocus we shouldn't
   // end up here.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void WebContentsViewChildFrame::ShowContextMenu(
     RenderFrameHost& render_frame_host,
     const ContextMenuParams& params) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 #if BUILDFLAG(USE_EXTERNAL_POPUP_MENU)
diff --git a/content/browser/web_exposed_isolation_info.cc b/content/browser/web_exposed_isolation_info.cc
index 804dccc..ba39745f 100644
--- a/content/browser/web_exposed_isolation_info.cc
+++ b/content/browser/web_exposed_isolation_info.cc
@@ -131,37 +131,37 @@
 
 bool operator==(const std::optional<WebExposedIsolationInfo>& a,
                 const std::optional<WebExposedIsolationInfo>& b) {
-  NOTREACHED() << kComparisonErrorMessage;
+  NOTREACHED_IN_MIGRATION() << kComparisonErrorMessage;
   return false;
 }
 
 bool operator==(const WebExposedIsolationInfo& a,
                 const std::optional<WebExposedIsolationInfo>& b) {
-  NOTREACHED() << kComparisonErrorMessage;
+  NOTREACHED_IN_MIGRATION() << kComparisonErrorMessage;
   return false;
 }
 
 bool operator==(const std::optional<WebExposedIsolationInfo>& a,
                 const WebExposedIsolationInfo& b) {
-  NOTREACHED() << kComparisonErrorMessage;
+  NOTREACHED_IN_MIGRATION() << kComparisonErrorMessage;
   return false;
 }
 
 bool operator!=(const std::optional<WebExposedIsolationInfo>& a,
                 const std::optional<WebExposedIsolationInfo>& b) {
-  NOTREACHED() << kComparisonErrorMessage;
+  NOTREACHED_IN_MIGRATION() << kComparisonErrorMessage;
   return false;
 }
 
 bool operator!=(const WebExposedIsolationInfo& a,
                 const std::optional<WebExposedIsolationInfo>& b) {
-  NOTREACHED() << kComparisonErrorMessage;
+  NOTREACHED_IN_MIGRATION() << kComparisonErrorMessage;
   return false;
 }
 
 bool operator!=(const std::optional<WebExposedIsolationInfo>& a,
                 const WebExposedIsolationInfo& b) {
-  NOTREACHED() << kComparisonErrorMessage;
+  NOTREACHED_IN_MIGRATION() << kComparisonErrorMessage;
   return false;
 }
 
diff --git a/content/browser/web_package/mock_signed_exchange_handler.cc b/content/browser/web_package/mock_signed_exchange_handler.cc
index 893430f..0c5b79f 100644
--- a/content/browser/web_package/mock_signed_exchange_handler.cc
+++ b/content/browser/web_package/mock_signed_exchange_handler.cc
@@ -253,7 +253,7 @@
           params, std::move(body), std::move(headers_callback));
     }
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
diff --git a/content/browser/web_package/prefetched_signed_exchange_cache.cc b/content/browser/web_package/prefetched_signed_exchange_cache.cc
index dc5a6c7b..112e54ba 100644
--- a/content/browser/web_package/prefetched_signed_exchange_cache.cc
+++ b/content/browser/web_package/prefetched_signed_exchange_cache.cc
@@ -82,7 +82,7 @@
   switch (initiator_lock_compatibility) {
     case network::InitiatorLockCompatibility::kBrowserProcess:
       // kBrowserProcess cannot happen outside of NetworkService.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return false;
 
     case network::InitiatorLockCompatibility::kNoLock:
@@ -90,7 +90,7 @@
       // Only browser-initiated navigations can specify no initiator and we only
       // expect subresource requests (i.e. non-navigations) to go through
       // SubresourceSignedExchangeURLLoaderFactory::CreateLoaderAndStart.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return false;
 
     case network::InitiatorLockCompatibility::kCompatibleLock:
@@ -100,13 +100,13 @@
       // This branch indicates that either 1) the CreateLoaderAndStart IPC was
       // forged by a malicious/compromised renderer process or 2) there are
       // renderer-side bugs.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return false;
   }
 
   // Failing safely for an unrecognied `network::InitiatorLockCompatibility`
   // enum value.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -165,7 +165,7 @@
       const net::HttpRequestHeaders& modified_headers,
       const net::HttpRequestHeaders& modified_cors_exempt_headers,
       const std::optional<GURL>& new_url) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   void SetPriority(net::RequestPriority priority,
                    int intra_priority_value) override {
@@ -310,7 +310,7 @@
       const net::HttpRequestHeaders& modified_headers,
       const net::HttpRequestHeaders& modified_cors_exempt_headers,
       const std::optional<GURL>& new_url) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   void SetPriority(net::RequestPriority priority,
                    int intra_priority_value) override {
@@ -430,7 +430,7 @@
       const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
       override {
     if (!IsValidRequestInitiator(request, request_initiator_origin_lock_)) {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       network::debug::ScopedResourceRequestCrashKeys request_crash_keys(
           request);
       network::debug::ScopedRequestInitiatorOriginLockCrashKey lock_crash_keys(
diff --git a/content/browser/web_package/signed_exchange_cert_fetcher.cc b/content/browser/web_package/signed_exchange_cert_fetcher.cc
index c9ae9d8..71b07d6e 100644
--- a/content/browser/web_package/signed_exchange_cert_fetcher.cc
+++ b/content/browser/web_package/signed_exchange_cert_fetcher.cc
@@ -317,7 +317,7 @@
     int64_t total_size,
     OnUploadProgressCallback callback) {
   // Cert fetching doesn't have request body.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void SignedExchangeCertFetcher::OnTransferSizeUpdated(
diff --git a/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc b/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
index 84a91155..7f9de58 100644
--- a/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
+++ b/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
@@ -140,7 +140,7 @@
 
   void Clone(mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory)
       override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   mojo::Remote<network::mojom::URLLoaderClient>& client_remote() {
diff --git a/content/browser/web_package/signed_exchange_error.cc b/content/browser/web_package/signed_exchange_error.cc
index 780494a..dfe5675 100644
--- a/content/browser/web_package/signed_exchange_error.cc
+++ b/content/browser/web_package/signed_exchange_error.cc
@@ -37,10 +37,10 @@
         kErrInvalidSignatureIntegrity_deprecated:
     case SignedExchangeSignatureVerifier::Result::
         kErrInvalidTimestamp_deprecated:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::nullopt;
 }
 
diff --git a/content/browser/web_package/signed_exchange_handler.cc b/content/browser/web_package/signed_exchange_handler.cc
index fc4049806..489b31d8 100644
--- a/content/browser/web_package/signed_exchange_handler.cc
+++ b/content/browser/web_package/signed_exchange_handler.cc
@@ -141,14 +141,14 @@
 
   switch (ocsp_result.revocation_status) {
     case bssl::OCSPRevocationStatus::GOOD:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     case bssl::OCSPRevocationStatus::REVOKED:
       return "OCSP response indicates that the certificate is revoked.";
     case bssl::OCSPRevocationStatus::UNKNOWN:
       return "OCSP responder doesn't know about the certificate.";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::string();
 }
 
@@ -312,7 +312,7 @@
         result = ParseHeadersAndFetchCertificate();
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
     if (result != SignedExchangeLoadResult::kSuccess) {
       RunErrorCallback(result, net::ERR_INVALID_SIGNED_EXCHANGE);
diff --git a/content/browser/web_package/signed_exchange_loader.cc b/content/browser/web_package/signed_exchange_loader.cc
index 1859896..33ce899 100644
--- a/content/browser/web_package/signed_exchange_loader.cc
+++ b/content/browser/web_package/signed_exchange_loader.cc
@@ -140,7 +140,7 @@
 
 void SignedExchangeLoader::OnReceiveEarlyHints(
     network::mojom::EarlyHintsPtr early_hints) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void SignedExchangeLoader::OnReceiveResponse(
@@ -149,7 +149,7 @@
     std::optional<mojo_base::BigBuffer> cached_metadata) {
   // Must not be called because this SignedExchangeLoader and the client
   // endpoints were bound after OnReceiveResponse() is called.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void SignedExchangeLoader::OnReceiveRedirect(
@@ -157,7 +157,7 @@
     network::mojom::URLResponseHeadPtr response_head) {
   // Must not be called because this SignedExchangeLoader and the client
   // endpoints were bound after OnReceiveResponse() is called.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void SignedExchangeLoader::OnUploadProgress(
@@ -166,7 +166,7 @@
     OnUploadProgressCallback ack_callback) {
   // Must not be called because this SignedExchangeLoader and the client
   // endpoints were bound after OnReceiveResponse() is called.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void SignedExchangeLoader::OnTransferSizeUpdated(int32_t transfer_size_diff) {
@@ -190,7 +190,7 @@
     const net::HttpRequestHeaders& modified_headers,
     const net::HttpRequestHeaders& modified_cors_exempt_headers,
     const std::optional<GURL>& new_url) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void SignedExchangeLoader::SetPriority(net::RequestPriority priority,
diff --git a/content/browser/web_package/signed_exchange_prefetch_handler.cc b/content/browser/web_package/signed_exchange_prefetch_handler.cc
index 7cad5fa..60000f2 100644
--- a/content/browser/web_package/signed_exchange_prefetch_handler.cc
+++ b/content/browser/web_package/signed_exchange_prefetch_handler.cc
@@ -82,14 +82,14 @@
 
 void SignedExchangePrefetchHandler::OnReceiveEarlyHints(
     network::mojom::EarlyHintsPtr early_hints) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void SignedExchangePrefetchHandler::OnReceiveResponse(
     network::mojom::URLResponseHeadPtr head,
     mojo::ScopedDataPipeConsumerHandle body,
     std::optional<mojo_base::BigBuffer> cached_metadata) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void SignedExchangePrefetchHandler::OnReceiveRedirect(
@@ -102,14 +102,14 @@
     int64_t current_position,
     int64_t total_size,
     base::OnceCallback<void()> callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void SignedExchangePrefetchHandler::OnTransferSizeUpdated(
     int32_t transfer_size_diff) {
   network::RecordOnTransferSizeUpdatedUMA(
       network::OnTransferSizeUpdatedFrom::kSignedExchangePrefetchHandler);
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void SignedExchangePrefetchHandler::OnComplete(
diff --git a/content/browser/web_package/signed_exchange_reporter.cc b/content/browser/web_package/signed_exchange_reporter.cc
index 989beb59..d99dd7a 100644
--- a/content/browser/web_package/signed_exchange_reporter.cc
+++ b/content/browser/web_package/signed_exchange_reporter.cc
@@ -88,7 +88,7 @@
     case SignedExchangeLoadResult::kPKPViolationError:
       return kSXGResultCertVerificationError;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return kSXGResultFailed;
 }
 
diff --git a/content/browser/web_package/signed_exchange_utils.cc b/content/browser/web_package/signed_exchange_utils.cc
index f152a19..689a45f 100644
--- a/content/browser/web_package/signed_exchange_utils.cc
+++ b/content/browser/web_package/signed_exchange_utils.cc
@@ -195,11 +195,11 @@
         kErrInvalidSignatureIntegrity_deprecated:
     case SignedExchangeSignatureVerifier::Result::
         kErrInvalidTimestamp_deprecated:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return SignedExchangeLoadResult::kSignatureVerificationError;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return SignedExchangeLoadResult::kSignatureVerificationError;
 }
 
diff --git a/content/browser/webauth/authenticator_common_impl.cc b/content/browser/webauth/authenticator_common_impl.cc
index a7b650a..a4f269b 100644
--- a/content/browser/webauth/authenticator_common_impl.cc
+++ b/content/browser/webauth/authenticator_common_impl.cc
@@ -1151,7 +1151,7 @@
   if (!payment_options.is_null() && options->allow_credentials.empty()) {
     CompleteGetAssertionRequest(
         blink::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR);
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   bool is_cross_origin_iframe = false;
@@ -2181,7 +2181,7 @@
       case RequestExtension::kLargeBlobRead:
       case RequestExtension::kLargeBlobWrite:
       case RequestExtension::kGetCredBlob:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
   }
@@ -2304,7 +2304,7 @@
       case RequestExtension::kLargeBlobEnable:
       case RequestExtension::kCredBlob:
       case RequestExtension::kMinPINLength:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
   }
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc
index ba6c8f31..ab1f9537 100644
--- a/content/browser/webauth/authenticator_impl_unittest.cc
+++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -1872,7 +1872,7 @@
     case AttestationConveyancePreference::ENTERPRISE:
       return "enterprise";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "";
   }
 }
@@ -5105,7 +5105,7 @@
         break;
 
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
 
     virtual_device_factory_->SetCtap2Config(config);
@@ -5217,7 +5217,7 @@
                       break;
 
                     default:
-                      NOTREACHED();
+                      NOTREACHED_IN_MIGRATION();
                   }
 
                   MakeCredentialResult result =
@@ -5247,7 +5247,7 @@
                       break;
 
                     default:
-                      NOTREACHED();
+                      NOTREACHED_IN_MIGRATION();
                   }
                 }
               }
@@ -5627,7 +5627,7 @@
                 break;
 
               default:
-                NOTREACHED();
+                NOTREACHED_IN_MIGRATION();
             }
 
             GetAssertionResult result = AuthenticatorGetAssertion(
@@ -5652,7 +5652,7 @@
                 break;
 
               default:
-                NOTREACHED();
+                NOTREACHED_IN_MIGRATION();
             }
           }
         }
@@ -7613,7 +7613,7 @@
 
         switch (test.resulting_policy) {
           case UNSPECIFIED:
-            NOTREACHED();
+            NOTREACHED_IN_MIGRATION();
             break;
           case NONE:
             EXPECT_EQ(device::CredProtect::kUVOptional, result);
@@ -7634,7 +7634,7 @@
         EXPECT_EQ(AuthenticatorStatus::NOT_ALLOWED_ERROR, status);
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
   }
 }
diff --git a/content/browser/webauth/virtual_authenticator.cc b/content/browser/webauth/virtual_authenticator.cc
index 15976ea..b0e9eca 100644
--- a/content/browser/webauth/virtual_authenticator.cc
+++ b/content/browser/webauth/virtual_authenticator.cc
@@ -158,7 +158,7 @@
       return std::make_unique<device::VirtualCtap2Device>(state_, config);
     }
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return std::make_unique<device::VirtualU2fDevice>(state_);
   }
 }
diff --git a/content/browser/webauth/virtual_authenticator_manager_impl.cc b/content/browser/webauth/virtual_authenticator_manager_impl.cc
index 1fd7fc4..70c28f0 100644
--- a/content/browser/webauth/virtual_authenticator_manager_impl.cc
+++ b/content/browser/webauth/virtual_authenticator_manager_impl.cc
@@ -75,7 +75,7 @@
   std::tie(std::ignore, was_inserted) = authenticators_.insert(
       {authenticator_ptr->unique_id(), std::move(authenticator)});
   if (!was_inserted) {
-    NOTREACHED() << "unique_id() must be unique";
+    NOTREACHED_IN_MIGRATION() << "unique_id() must be unique";
     return nullptr;
   }
 
diff --git a/content/browser/webauth/virtual_authenticator_mojom_traits.cc b/content/browser/webauth/virtual_authenticator_mojom_traits.cc
index 58afea0b..6b10751 100644
--- a/content/browser/webauth/virtual_authenticator_mojom_traits.cc
+++ b/content/browser/webauth/virtual_authenticator_mojom_traits.cc
@@ -18,10 +18,10 @@
     case ::device::ProtocolVersion::kCtap2:
       return ClientToAuthenticatorProtocol::CTAP2;
     case ::device::ProtocolVersion::kUnknown:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return ClientToAuthenticatorProtocol::U2F;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return ClientToAuthenticatorProtocol::U2F;
 }
 
@@ -37,7 +37,7 @@
       *output = ::device::ProtocolVersion::kCtap2;
       return true;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -50,7 +50,7 @@
     case ::device::Ctap2Version::kCtap2_1:
       return Ctap2Version::CTAP2_1;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return Ctap2Version::CTAP2_0;
 }
 
@@ -66,7 +66,7 @@
       *output = ::device::Ctap2Version::kCtap2_1;
       return true;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
diff --git a/content/browser/webid/federated_auth_disconnect_request.cc b/content/browser/webid/federated_auth_disconnect_request.cc
index a5524ab..de55d14 100644
--- a/content/browser/webid/federated_auth_disconnect_request.cc
+++ b/content/browser/webid/federated_auth_disconnect_request.cc
@@ -88,7 +88,7 @@
       // Intentional fall-through.
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   if (error_disconnect_status) {
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc
index 82a5c4f..6fed0f5f 100644
--- a/content/browser/webid/federated_auth_request_impl.cc
+++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -888,7 +888,7 @@
       // Intentional fall-through.
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 
@@ -1361,7 +1361,8 @@
   // trigger the callback.
   if (!disconnect_request_ &&
       status == blink::mojom::DisconnectStatus::kSuccess) {
-    NOTREACHED() << "The successful disconnect request is nowhere to be found";
+    NOTREACHED_IN_MIGRATION()
+        << "The successful disconnect request is nowhere to be found";
     return;
   }
   std::move(callback).Run(status);
@@ -2539,7 +2540,8 @@
       return;
     }
     case IdpNetworkRequestManager::ParseStatus::kEmptyListError: {
-      NOTREACHED() << "kEmptyListError is undefined for CompleteTokenRequest";
+      NOTREACHED_IN_MIGRATION()
+          << "kEmptyListError is undefined for CompleteTokenRequest";
       return;
     }
     case IdpNetworkRequestManager::ParseStatus::kSuccess: {
@@ -2826,7 +2828,8 @@
   // callback.
   if (it == user_info_requests_.end() &&
       status == blink::mojom::RequestUserInfoStatus::kSuccess) {
-    NOTREACHED() << "The successful user info request is nowhere to be found";
+    NOTREACHED_IN_MIGRATION()
+        << "The successful user info request is nowhere to be found";
     return;
   }
   std::move(callback).Run(status, std::move(user_info));
diff --git a/content/browser/webid/federated_auth_user_info_request.cc b/content/browser/webid/federated_auth_user_info_request.cc
index 6ba72d7..86fb530e3 100644
--- a/content/browser/webid/federated_auth_user_info_request.cc
+++ b/content/browser/webid/federated_auth_user_info_request.cc
@@ -57,7 +57,7 @@
     }
     case FederatedAuthUserInfoRequestResult::kUnhandledRequest:
     case FederatedAuthUserInfoRequestResult::kSuccess: {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "";
     }
   }
diff --git a/content/browser/webid/federated_provider_fetcher.cc b/content/browser/webid/federated_provider_fetcher.cc
index 90c7ff7..cb667575 100644
--- a/content/browser/webid/federated_provider_fetcher.cc
+++ b/content/browser/webid/federated_provider_fetcher.cc
@@ -142,7 +142,7 @@
         return;
       }
       case IdpNetworkRequestManager::ParseStatus::kSuccess: {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }
     }
   }
@@ -197,11 +197,12 @@
         return;
       }
       case IdpNetworkRequestManager::ParseStatus::kEmptyListError: {
-        NOTREACHED() << "kEmptyListError is undefined for OnConfigFetched";
+        NOTREACHED_IN_MIGRATION()
+            << "kEmptyListError is undefined for OnConfigFetched";
         return;
       }
       case IdpNetworkRequestManager::ParseStatus::kSuccess: {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
       }
     }
   }
diff --git a/content/browser/webid/webid_utils.cc b/content/browser/webid/webid_utils.cc
index 538572e..b20ed64 100644
--- a/content/browser/webid/webid_utils.cc
+++ b/content/browser/webid/webid_utils.cc
@@ -319,7 +319,7 @@
     FedCmDisconnectStatus disconnect_status_for_metrics) {
   switch (disconnect_status_for_metrics) {
     case FedCmDisconnectStatus::kSuccess: {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return "";
     }
     case FedCmDisconnectStatus::kTooManyRequests: {
diff --git a/content/browser/webrtc/webrtc_internals.cc b/content/browser/webrtc/webrtc_internals.cc
index 07414b8..ef91e1dc 100644
--- a/content/browser/webrtc/webrtc_internals.cc
+++ b/content/browser/webrtc/webrtc_internals.cc
@@ -700,7 +700,7 @@
                  base::Value());
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   select_file_dialog_ = nullptr;
 }
diff --git a/content/browser/webui/url_data_manager_backend.cc b/content/browser/webui/url_data_manager_backend.cc
index 0e4fc08e..8ccf6f1a 100644
--- a/content/browser/webui/url_data_manager_backend.cc
+++ b/content/browser/webui/url_data_manager_backend.cc
@@ -136,7 +136,7 @@
     const base::Value::Dict& update) {
   auto it = data_sources_.find(source_name);
   if (it == data_sources_.end() || !it->second->IsWebUIDataSourceImpl()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   static_cast<WebUIDataSourceImpl*>(it->second.get())
@@ -269,7 +269,7 @@
           SchemeIsInSchemes(url.scheme(), additional_schemes)));
 
   if (!url.is_valid()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return false;
   }
 
diff --git a/content/browser/webui/web_ui_controller_factory_registry.cc b/content/browser/webui/web_ui_controller_factory_registry.cc
index 9c1edfd..a1d85e1 100644
--- a/content/browser/webui/web_ui_controller_factory_registry.cc
+++ b/content/browser/webui/web_ui_controller_factory_registry.cc
@@ -97,12 +97,13 @@
       return;
     }
   }
-  NOTREACHED() << "Tried to unregister a factory but it wasn't found. Tip: if "
-                  "trying to unregister a global like "
-                  "ChromeWebUIControllerFactory::GetInstance(), create the "
-                  "ScopedWebUIControllerFactoryRegistration in the "
-                  "setup method instead of the constructor, to ensure the "
-                  "global exists.";
+  NOTREACHED_IN_MIGRATION()
+      << "Tried to unregister a factory but it wasn't found. Tip: if "
+         "trying to unregister a global like "
+         "ChromeWebUIControllerFactory::GetInstance(), create the "
+         "ScopedWebUIControllerFactoryRegistration in the "
+         "setup method instead of the constructor, to ensure the "
+         "global exists.";
 }
 
 }  // namespace content
diff --git a/content/browser/webui/web_ui_security_browsertest.cc b/content/browser/webui/web_ui_security_browsertest.cc
index 582a36df..c8c2862f 100644
--- a/content/browser/webui/web_ui_security_browsertest.cc
+++ b/content/browser/webui/web_ui_security_browsertest.cc
@@ -623,7 +623,7 @@
       fetch_mode_string = "no-cors";
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   const char kFetchRequestScript[] =
       "fetch($1, {mode: $2}).then("
diff --git a/content/browser/worker_host/worker_browsertest.cc b/content/browser/worker_host/worker_browsertest.cc
index 31ead10..d262b2d 100644
--- a/content/browser/worker_host/worker_browsertest.cc
+++ b/content/browser/worker_host/worker_browsertest.cc
@@ -116,7 +116,7 @@
             {});
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
   }
diff --git a/content/browser/worker_host/worker_script_fetcher.cc b/content/browser/worker_host/worker_script_fetcher.cc
index 2195471..c2da484 100644
--- a/content/browser/worker_host/worker_script_fetcher.cc
+++ b/content/browser/worker_host/worker_script_fetcher.cc
@@ -344,7 +344,7 @@
           static_cast<int>(blink::mojom::ResourceType::kSharedWorker);
       break;
     default:
-      NOTREACHED() << static_cast<int>(request_destination);
+      NOTREACHED_IN_MIGRATION() << static_cast<int>(request_destination);
       break;
   }
 
@@ -717,13 +717,13 @@
 void WorkerScriptFetcher::OnUploadProgress(int64_t current_position,
                                            int64_t total_size,
                                            OnUploadProgressCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void WorkerScriptFetcher::OnTransferSizeUpdated(int32_t transfer_size_diff) {
   network::RecordOnTransferSizeUpdatedUMA(
       network::OnTransferSizeUpdatedFrom::kWorkerScriptFetcher);
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void WorkerScriptFetcher::OnComplete(
diff --git a/content/browser/worker_host/worker_script_loader_factory.cc b/content/browser/worker_host/worker_script_loader_factory.cc
index 57fce21..60070a79 100644
--- a/content/browser/worker_host/worker_script_loader_factory.cc
+++ b/content/browser/worker_host/worker_script_loader_factory.cc
@@ -73,7 +73,7 @@
     mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver) {
   // This method is required to support synchronous requests, which shared
   // worker script requests are not.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 }  // namespace content
diff --git a/content/browser/worker_network_isolation_key_browsertest.cc b/content/browser/worker_network_isolation_key_browsertest.cc
index 18ba627..e18ffeb 100644
--- a/content/browser/worker_network_isolation_key_browsertest.cc
+++ b/content/browser/worker_network_isolation_key_browsertest.cc
@@ -205,7 +205,7 @@
                 EXPECT_EQ(status.exists_in_cache,
                           test_same_network_isolation_key);
               } else {
-                NOTREACHED();
+                NOTREACHED_IN_MIGRATION();
               }
             }
             if (request_completed_count[import_script_url] == 2 &&
@@ -298,7 +298,7 @@
                 EXPECT_TRUE(status.exists_in_cache);
                 cache_status_waiter.Quit();
               } else {
-                NOTREACHED();
+                NOTREACHED_IN_MIGRATION();
               }
             }
           }),
@@ -366,7 +366,7 @@
                 EXPECT_FALSE(status.exists_in_cache);
                 cache_status_waiter.Quit();
               } else {
-                NOTREACHED();
+                NOTREACHED_IN_MIGRATION();
               }
             }
           }),
diff --git a/content/browser/xr/service/browser_xr_runtime_impl.cc b/content/browser/xr/service/browser_xr_runtime_impl.cc
index 9674547b..d848da5 100644
--- a/content/browser/xr/service/browser_xr_runtime_impl.cc
+++ b/content/browser/xr/service/browser_xr_runtime_impl.cc
@@ -204,7 +204,7 @@
 #endif
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 bool BrowserXRRuntimeImpl::SupportsNonEmulatedHeight() const {
@@ -226,7 +226,7 @@
 #endif  // ENABLE_OPENXR
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 bool BrowserXRRuntimeImpl::SupportsArBlendMode() {
diff --git a/content/browser/xr/service/xr_runtime_manager_impl.cc b/content/browser/xr/service/xr_runtime_manager_impl.cc
index cece439..4cf52da2 100644
--- a/content/browser/xr/service/xr_runtime_manager_impl.cc
+++ b/content/browser/xr/service/xr_runtime_manager_impl.cc
@@ -448,7 +448,7 @@
 #else
     // MakeXrCompatible is not yet supported on other platforms so
     // IsInitializedOnCompatibleAdapter should have returned true.
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 #endif
   }
 
diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc
index 18c303a7..21f5064e 100644
--- a/content/child/child_thread_impl.cc
+++ b/content/child/child_thread_impl.cc
@@ -848,11 +848,11 @@
 #endif
 
 void ChildThreadImpl::RecordAction(const base::UserMetricsAction& action) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ChildThreadImpl::RecordComputedAction(const std::string& action) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ChildThreadImpl::BindHostReceiver(mojo::GenericPendingReceiver receiver) {
@@ -884,7 +884,7 @@
   // All associated interfaces are requested through RenderThreadImpl.
   LOG(ERROR) << "Receiver for unknown Channel-associated interface: "
              << interface_name;
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ChildThreadImpl::ExposeInterfacesToBrowser(mojo::BinderMap binders) {
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 4fe7bf2..a50d14d 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -169,7 +169,7 @@
       }
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 }
 
@@ -476,6 +476,10 @@
       {wrf::EnableSharedWorker, switches::kDisableSharedWorkers, false},
       {wrf::EnableMutationEvents, blink::switches::kMutationEventsEnabled,
        true},
+      {wrf::EnableKeyboardFocusableScrollers,
+       blink::switches::kKeyboardFocusableScrollersEnabled, true},
+      {wrf::EnableKeyboardFocusableScrollers,
+       blink::switches::kKeyboardFocusableScrollersOptOut, false},
       {wrf::EnableTextFragmentIdentifiers,
        switches::kDisableScrollToTextFragment, false},
       {wrf::EnableWebAuthenticationRemoteDesktopSupport,
diff --git a/content/common/android/cpu_time_metrics_internal.cc b/content/common/android/cpu_time_metrics_internal.cc
index 4c04151..d4a0c20 100644
--- a/content/common/android/cpu_time_metrics_internal.cc
+++ b/content/common/android/cpu_time_metrics_internal.cc
@@ -62,7 +62,7 @@
     return ProcessTypeForUma::kGpu;
   if (process_type == switches::kPpapiPluginProcess)
     return ProcessTypeForUma::kPpapiPlugin;
-  NOTREACHED() << "Unexpected process type: " << process_type;
+  NOTREACHED_IN_MIGRATION() << "Unexpected process type: " << process_type;
   return ProcessTypeForUma::kUnknown;
 }
 
diff --git a/content/common/android/gin_java_bridge_errors.cc b/content/common/android/gin_java_bridge_errors.cc
index ba973ca8..a8e5af16 100644
--- a/content/common/android/gin_java_bridge_errors.cc
+++ b/content/common/android/gin_java_bridge_errors.cc
@@ -29,7 +29,7 @@
     case mojom::GinJavaBridgeError::kGinJavaBridgeRenderFrameDeleted:
       return "RenderFrame has been deleted";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return "Unknown error";
 }
 
diff --git a/content/common/frame_owner_element_type_mojom_traits.cc b/content/common/frame_owner_element_type_mojom_traits.cc
index ace6176..cd15360 100644
--- a/content/common/frame_owner_element_type_mojom_traits.cc
+++ b/content/common/frame_owner_element_type_mojom_traits.cc
@@ -25,7 +25,7 @@
       // represent child frames. The `input` must represent a child frame to be
       // serializable. See the definition of `ChildFrameOwnerElementType`
       // for details.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return content::mojom::ChildFrameOwnerElementType::kIframe;
   }
 }
diff --git a/content/common/input/actions_parser.cc b/content/common/input/actions_parser.cc
index 47e2bf6..b380b92 100644
--- a/content/common/input/actions_parser.cc
+++ b/content/common/input/actions_parser.cc
@@ -59,7 +59,7 @@
     return Button::BACK;
   if (button == 4)
     return Button::FORWARD;
-  NOTREACHED() << "Unexpected button";
+  NOTREACHED_IN_MIGRATION() << "Unexpected button";
   return Button();
 }
 
@@ -425,7 +425,7 @@
   } else if (source_type == "none") {
     return ParseNullAction(action, subtype, param_list);
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   return false;
 }
diff --git a/content/common/input/fling_controller.cc b/content/common/input/fling_controller.cc
index ad7ee37..983be1e 100644
--- a/content/common/input/fling_controller.cc
+++ b/content/common/input/fling_controller.cc
@@ -341,7 +341,7 @@
       break;
     case blink::WebGestureDevice::kUninitialized:
     case blink::WebGestureDevice::kScrollbar:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "Fling controller doesn't handle flings with source device:"
           << static_cast<int>(current_fling_parameters_.source_device);
   }
@@ -362,7 +362,7 @@
       break;
     case blink::WebGestureDevice::kUninitialized:
     case blink::WebGestureDevice::kScrollbar:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "Fling controller doesn't handle flings with source device:"
           << static_cast<int>(current_fling_parameters_.source_device);
   }
diff --git a/content/common/input/input_injector_mojom_traits.cc b/content/common/input/input_injector_mojom_traits.cc
index 6cd2c30..edbe58c8 100644
--- a/content/common/input/input_injector_mojom_traits.cc
+++ b/content/common/input/input_injector_mojom_traits.cc
@@ -29,7 +29,7 @@
       return content::mojom::PointerActionType::kIdle;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return content::mojom::PointerActionType::kMaxValue;
 }
 
@@ -66,7 +66,7 @@
       return true;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -90,7 +90,7 @@
       return content::mojom::SyntheticButton::kForward;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return content::mojom::SyntheticButton::kMaxValue;
 }
 
@@ -120,7 +120,7 @@
       return true;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
diff --git a/content/common/input/render_input_router.cc b/content/common/input/render_input_router.cc
index 4fc0161a..41ee64f 100644
--- a/content/common/input/render_input_router.cc
+++ b/content/common/input/render_input_router.cc
@@ -84,18 +84,18 @@
           host,
       mojo::PendingAssociatedReceiver<blink::mojom::SynchronousCompositor>
           compositor_request) override {
-    NOTREACHED() << "Input request on unbound interface";
+    NOTREACHED_IN_MIGRATION() << "Input request on unbound interface";
   }
 #endif
   void GetFrameWidgetInputHandler(
       mojo::PendingAssociatedReceiver<blink::mojom::FrameWidgetInputHandler>
           request) override {
-    NOTREACHED() << "Input request on unbound interface";
+    NOTREACHED_IN_MIGRATION() << "Input request on unbound interface";
   }
   void UpdateBrowserControlsState(cc::BrowserControlsState constraints,
                                   cc::BrowserControlsState current,
                                   bool animate) override {
-    NOTREACHED() << "Input request on unbound interface";
+    NOTREACHED_IN_MIGRATION() << "Input request on unbound interface";
   }
 };
 
diff --git a/content/common/input/synthetic_gesture_controller.cc b/content/common/input/synthetic_gesture_controller.cc
index 2118a02..f087e3c 100644
--- a/content/common/input/synthetic_gesture_controller.cc
+++ b/content/common/input/synthetic_gesture_controller.cc
@@ -145,7 +145,7 @@
       event_interval_ = vsync_interval * 2.0f;
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 
diff --git a/content/common/input/synthetic_gesture_controller_unittest.cc b/content/common/input/synthetic_gesture_controller_unittest.cc
index 0eb8d2b..9d670fd 100644
--- a/content/common/input/synthetic_gesture_controller_unittest.cc
+++ b/content/common/input/synthetic_gesture_controller_unittest.cc
@@ -70,11 +70,12 @@
       return WebTouchPoint::State::kStateStationary;
     case SyntheticPointerActionParams::PointerActionType::LEAVE:
     case SyntheticPointerActionParams::PointerActionType::NOT_INITIALIZED:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "Invalid SyntheticPointerActionParams::PointerActionType.";
       return WebTouchPoint::State::kStateUndefined;
   }
-  NOTREACHED() << "Invalid SyntheticPointerActionParams::PointerActionType.";
+  NOTREACHED_IN_MIGRATION()
+      << "Invalid SyntheticPointerActionParams::PointerActionType.";
   return WebTouchPoint::State::kStateUndefined;
 }
 
@@ -92,11 +93,12 @@
     case SyntheticPointerActionParams::PointerActionType::CANCEL:
     case SyntheticPointerActionParams::PointerActionType::IDLE:
     case SyntheticPointerActionParams::PointerActionType::NOT_INITIALIZED:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "Invalid SyntheticPointerActionParams::PointerActionType.";
       return WebInputEvent::Type::kUndefined;
   }
-  NOTREACHED() << "Invalid SyntheticPointerActionParams::PointerActionType.";
+  NOTREACHED_IN_MIGRATION()
+      << "Invalid SyntheticPointerActionParams::PointerActionType.";
   return WebInputEvent::Type::kUndefined;
 }
 
@@ -440,7 +442,7 @@
       case ZOOM_DIRECTION_UNKNOWN:
         return 1.0f;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return 0.0f;
     }
   }
diff --git a/content/common/input/synthetic_pointer_action_params.cc b/content/common/input/synthetic_pointer_action_params.cc
index ec56a163..0a894fc 100644
--- a/content/common/input/synthetic_pointer_action_params.cc
+++ b/content/common/input/synthetic_pointer_action_params.cc
@@ -36,7 +36,7 @@
     case SyntheticPointerActionParams::Button::NO_BUTTON:
       return blink::WebMouseEvent::kNoModifiers;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return blink::WebMouseEvent::kNoModifiers;
 }
 
@@ -58,7 +58,7 @@
     case SyntheticPointerActionParams::Button::NO_BUTTON:
       return blink::WebMouseEvent::Button::kNoButton;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return blink::WebMouseEvent::Button::kNoButton;
 }
 
diff --git a/content/common/input/synthetic_pointer_action_unittest.cc b/content/common/input/synthetic_pointer_action_unittest.cc
index 373b6b72..69e705c9 100644
--- a/content/common/input/synthetic_pointer_action_unittest.cc
+++ b/content/common/input/synthetic_pointer_action_unittest.cc
@@ -38,11 +38,12 @@
       return WebTouchPoint::State::kStateStationary;
     case SyntheticPointerActionParams::PointerActionType::LEAVE:
     case SyntheticPointerActionParams::PointerActionType::NOT_INITIALIZED:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "Invalid SyntheticPointerActionParams::PointerActionType.";
       return WebTouchPoint::State::kStateUndefined;
   }
-  NOTREACHED() << "Invalid SyntheticPointerActionParams::PointerActionType.";
+  NOTREACHED_IN_MIGRATION()
+      << "Invalid SyntheticPointerActionParams::PointerActionType.";
   return WebTouchPoint::State::kStateUndefined;
 }
 
@@ -60,11 +61,12 @@
     case SyntheticPointerActionParams::PointerActionType::CANCEL:
     case SyntheticPointerActionParams::PointerActionType::IDLE:
     case SyntheticPointerActionParams::PointerActionType::NOT_INITIALIZED:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "Invalid SyntheticPointerActionParams::PointerActionType.";
       return WebInputEvent::Type::kUndefined;
   }
-  NOTREACHED() << "Invalid SyntheticPointerActionParams::PointerActionType.";
+  NOTREACHED_IN_MIGRATION()
+      << "Invalid SyntheticPointerActionParams::PointerActionType.";
   return WebInputEvent::Type::kUndefined;
 }
 
diff --git a/content/common/input/synthetic_pointer_driver.cc b/content/common/input/synthetic_pointer_driver.cc
index 0303a3a5..6bf25fe 100644
--- a/content/common/input/synthetic_pointer_driver.cc
+++ b/content/common/input/synthetic_pointer_driver.cc
@@ -26,7 +26,7 @@
     case content::mojom::GestureSourceType::kDefaultInput:
       return nullptr;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
diff --git a/content/common/input/synthetic_smooth_move_gesture.cc b/content/common/input/synthetic_smooth_move_gesture.cc
index 074e2e94..8c19811 100644
--- a/content/common/input/synthetic_smooth_move_gesture.cc
+++ b/content/common/input/synthetic_smooth_move_gesture.cc
@@ -179,11 +179,11 @@
       }
       break;
     case SETUP:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "State SETUP invalid for synthetic scroll using touch input.";
       break;
     case DONE:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "State DONE invalid for synthetic scroll using touch input.";
       break;
   }
@@ -238,15 +238,17 @@
       }
     } break;
     case SETUP:
-      NOTREACHED() << "State SETUP invalid for synthetic scroll using mouse "
-                      "wheel input.";
+      NOTREACHED_IN_MIGRATION()
+          << "State SETUP invalid for synthetic scroll using mouse "
+             "wheel input.";
       break;
     case STOPPING:
-      NOTREACHED() << "State STOPPING invalid for synthetic scroll using mouse "
-                      "wheel input.";
+      NOTREACHED_IN_MIGRATION()
+          << "State STOPPING invalid for synthetic scroll using mouse "
+             "wheel input.";
       break;
     case DONE:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "State DONE invalid for synthetic scroll using mouse wheel input.";
       break;
   }
@@ -293,15 +295,15 @@
       }
     } break;
     case STOPPING:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "State STOPPING invalid for synthetic drag using mouse input.";
       break;
     case SETUP:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "State SETUP invalid for synthetic drag using mouse input.";
       break;
     case DONE:
-      NOTREACHED()
+      NOTREACHED_IN_MIGRATION()
           << "State DONE invalid for synthetic drag using mouse input.";
       break;
   }
diff --git a/content/common/input/synthetic_tap_gesture.cc b/content/common/input/synthetic_tap_gesture.cc
index d445075b..044c83d 100644
--- a/content/common/input/synthetic_tap_gesture.cc
+++ b/content/common/input/synthetic_tap_gesture.cc
@@ -121,10 +121,12 @@
       }
       break;
     case SETUP:
-      NOTREACHED() << "State SETUP invalid for synthetic tap gesture.";
+      NOTREACHED_IN_MIGRATION()
+          << "State SETUP invalid for synthetic tap gesture.";
       break;
     case DONE:
-      NOTREACHED() << "State DONE invalid for synthetic tap gesture.";
+      NOTREACHED_IN_MIGRATION()
+          << "State DONE invalid for synthetic tap gesture.";
       break;
   }
 }
diff --git a/content/common/input/synthetic_touch_driver.cc b/content/common/input/synthetic_touch_driver.cc
index 302892a..8a1605fa 100644
--- a/content/common/input/synthetic_touch_driver.cc
+++ b/content/common/input/synthetic_touch_driver.cc
@@ -165,7 +165,7 @@
       return it->first;
     }
   }
-  NOTREACHED() << "Failed to find the value.";
+  NOTREACHED_IN_MIGRATION() << "Failed to find the value.";
   return -1;
 }
 
diff --git a/content/common/input/synthetic_touchpad_pinch_gesture.cc b/content/common/input/synthetic_touchpad_pinch_gesture.cc
index e192ce0..154ff50 100644
--- a/content/common/input/synthetic_touchpad_pinch_gesture.cc
+++ b/content/common/input/synthetic_touchpad_pinch_gesture.cc
@@ -131,10 +131,10 @@
       break;
     }
     case SETUP:
-      NOTREACHED() << "State SETUP invalid for synthetic pinch.";
+      NOTREACHED_IN_MIGRATION() << "State SETUP invalid for synthetic pinch.";
       break;
     case DONE:
-      NOTREACHED() << "State DONE invalid for synthetic pinch.";
+      NOTREACHED_IN_MIGRATION() << "State DONE invalid for synthetic pinch.";
       break;
   }
 }
diff --git a/content/common/input/synthetic_touchscreen_pinch_gesture.cc b/content/common/input/synthetic_touchscreen_pinch_gesture.cc
index 18996aa..9de90444 100644
--- a/content/common/input/synthetic_touchscreen_pinch_gesture.cc
+++ b/content/common/input/synthetic_touchscreen_pinch_gesture.cc
@@ -105,10 +105,10 @@
       }
     } break;
     case SETUP:
-      NOTREACHED() << "State SETUP invalid for synthetic pinch.";
+      NOTREACHED_IN_MIGRATION() << "State SETUP invalid for synthetic pinch.";
       break;
     case DONE:
-      NOTREACHED() << "State DONE invalid for synthetic pinch.";
+      NOTREACHED_IN_MIGRATION() << "State DONE invalid for synthetic pinch.";
       break;
   }
 }
diff --git a/content/common/input/tap_suppression_controller.cc b/content/common/input/tap_suppression_controller.cc
index 2c3f3777..5378558 100644
--- a/content/common/input/tap_suppression_controller.cc
+++ b/content/common/input/tap_suppression_controller.cc
@@ -52,7 +52,7 @@
       state_ = NOTHING;
       return false;
   }
-  NOTREACHED() << "Invalid state";
+  NOTREACHED_IN_MIGRATION() << "Invalid state";
   return false;
 }
 
diff --git a/content/common/input/touch_action_filter.cc b/content/common/input/touch_action_filter.cc
index fbc993d..ea843f0 100644
--- a/content/common/input/touch_action_filter.cc
+++ b/content/common/input/touch_action_filter.cc
@@ -173,7 +173,7 @@
     case WebInputEvent::Type::kGestureFlingStart:
       // Fling controller processes FlingStart event, and we should never get
       // it here.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
 
     case WebInputEvent::Type::kGestureScrollEnd:
diff --git a/content/common/input/web_input_event_builders_ios.mm b/content/common/input/web_input_event_builders_ios.mm
index b8f0037..4180bb0 100644
--- a/content/common/input/web_input_event_builders_ios.mm
+++ b/content/common/input/web_input_event_builders_ios.mm
@@ -92,7 +92,7 @@
     case UITouchPhaseStationary:
       return blink::WebTouchPoint::State::kStateStationary;
   }
-  NOTREACHED() << "Invalid MotionEvent::Action.";
+  NOTREACHED_IN_MIGRATION() << "Invalid MotionEvent::Action.";
   return blink::WebTouchPoint::State::kStateUndefined;
 }
 
diff --git a/content/common/input/web_input_event_builders_mac.mm b/content/common/input/web_input_event_builders_mac.mm
index b6a8df3..324fd49 100644
--- a/content/common/input/web_input_event_builders_mac.mm
+++ b/content/common/input/web_input_event_builders_mac.mm
@@ -150,7 +150,7 @@
 #if DCHECK_IS_ON()
     if (@available(macOS 10.15.1, *)) { /* nop */
     } else {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
 #endif
     result->movement_x = CGEventGetIntegerValueField(
@@ -678,7 +678,7 @@
       state = blink::WebTouchPoint::State::kStateMoved;
       break;
     default:
-      NOTREACHED() << "Invalid types for touch events." << type;
+      NOTREACHED_IN_MIGRATION() << "Invalid types for touch events." << type;
   }
 
   blink::WebTouchEvent result(event_type, ModifiersFromEvent(event),
diff --git a/content/common/input/web_touch_event_traits.cc b/content/common/input/web_touch_event_traits.cc
index b805728..296dacf 100644
--- a/content/common/input/web_touch_event_traits.cc
+++ b/content/common/input/web_touch_event_traits.cc
@@ -61,7 +61,7 @@
       newState = WebTouchPoint::State::kStateCancelled;
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
   for (size_t i = 0; i < event->touches_length; ++i)
diff --git a/content/common/service_worker/race_network_request_url_loader_client.cc b/content/common/service_worker/race_network_request_url_loader_client.cc
index 523bffc..070b62b7 100644
--- a/content/common/service_worker/race_network_request_url_loader_client.cc
+++ b/content/common/service_worker/race_network_request_url_loader_client.cc
@@ -72,7 +72,7 @@
     int64_t current_position,
     int64_t total_size,
     OnUploadProgressCallback ack_callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ServiceWorkerRaceNetworkRequestURLLoaderClient::OnTransferSizeUpdated(
@@ -437,7 +437,7 @@
       return;
     default:
       SCOPED_CRASH_KEY_NUMBER("SWRace", "read_result", read_result);
-      NOTREACHED() << "ReadData result:" << read_result;
+      NOTREACHED_IN_MIGRATION() << "ReadData result:" << read_result;
       return;
   }
 }
diff --git a/content/common/zygote/zygote_communication_linux.cc b/content/common/zygote/zygote_communication_linux.cc
index ad02768..5ff93c7 100644
--- a/content/common/zygote/zygote_communication_linux.cc
+++ b/content/common/zygote/zygote_communication_linux.cc
@@ -157,7 +157,7 @@
         // Zygote children should still be trustworthy when they're supposed to
         // ping us, so something's broken if we don't receive a valid ping.
         LOG(ERROR) << "Did not receive ping from zygote child";
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         real_pid = -1;
       }
       my_sock.reset();
diff --git a/content/ppapi_plugin/ppapi_blink_platform_impl.cc b/content/ppapi_plugin/ppapi_blink_platform_impl.cc
index 74c84d8..abf6376 100644
--- a/content/ppapi_plugin/ppapi_blink_platform_impl.cc
+++ b/content/ppapi_plugin/ppapi_blink_platform_impl.cc
@@ -64,12 +64,12 @@
 
 uint64_t PpapiBlinkPlatformImpl::VisitedLinkHash(
     std::string_view canonical_url) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return 0;
 }
 
 bool PpapiBlinkPlatformImpl::IsLinkVisited(uint64_t link_hash) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
diff --git a/content/public/browser/authenticator_request_client_delegate.cc b/content/public/browser/authenticator_request_client_delegate.cc
index 57b58d8..286d9d5 100644
--- a/content/public/browser/authenticator_request_client_delegate.cc
+++ b/content/public/browser/authenticator_request_client_delegate.cc
@@ -234,7 +234,7 @@
 void AuthenticatorRequestClientDelegate::CollectPIN(
     CollectPINOptions options,
     base::OnceCallback<void(std::u16string)> provide_pin_cb) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void AuthenticatorRequestClientDelegate::StartBioEnrollment(
diff --git a/content/public/browser/ax_inspect_factory.cc b/content/public/browser/ax_inspect_factory.cc
index 15303fb2..487c6a9e 100644
--- a/content/public/browser/ax_inspect_factory.cc
+++ b/content/public/browser/ax_inspect_factory.cc
@@ -55,7 +55,8 @@
     case ui::AXApiType::kBlink:
       return std::make_unique<AccessibilityTreeFormatterBlink>();
     default:
-      NOTREACHED() << "Unsupported API type " << static_cast<std::string>(type);
+      NOTREACHED_IN_MIGRATION()
+          << "Unsupported API type " << static_cast<std::string>(type);
   }
   return nullptr;
 }
diff --git a/content/public/browser/ax_inspect_factory_android.cc b/content/public/browser/ax_inspect_factory_android.cc
index 1659d85d..55c9fe7 100644
--- a/content/public/browser/ax_inspect_factory_android.cc
+++ b/content/public/browser/ax_inspect_factory_android.cc
@@ -38,7 +38,8 @@
     case ui::AXApiType::kBlink:
       return std::make_unique<AccessibilityTreeFormatterBlink>();
     default:
-      NOTREACHED() << "Unsupported API type " << static_cast<std::string>(type);
+      NOTREACHED_IN_MIGRATION()
+          << "Unsupported API type " << static_cast<std::string>(type);
   }
   return nullptr;
 }
@@ -54,7 +55,8 @@
   // using an inspection tool, e.g. chrome://accessibility.
   ui::AXTreeManager::AlwaysFailFast();
 
-  NOTREACHED() << "Unsupported API type " << static_cast<std::string>(type);
+  NOTREACHED_IN_MIGRATION()
+      << "Unsupported API type " << static_cast<std::string>(type);
   return nullptr;
 }
 
diff --git a/content/public/browser/ax_inspect_factory_auralinux.cc b/content/public/browser/ax_inspect_factory_auralinux.cc
index 7126e1a..9cf810cc 100644
--- a/content/public/browser/ax_inspect_factory_auralinux.cc
+++ b/content/public/browser/ax_inspect_factory_auralinux.cc
@@ -36,7 +36,8 @@
     case ui::AXApiType::kLinux:
       return std::make_unique<ui::AXTreeFormatterAuraLinux>();
     default:
-      NOTREACHED() << "Unsupported API type " << static_cast<std::string>(type);
+      NOTREACHED_IN_MIGRATION()
+          << "Unsupported API type " << static_cast<std::string>(type);
   }
   return nullptr;
 }
@@ -57,7 +58,8 @@
       return std::make_unique<ui::AXEventRecorderAuraLinux>(
           manager->GetWeakPtr(), pid, selector);
     default:
-      NOTREACHED() << "Unsupported API type " << static_cast<std::string>(type);
+      NOTREACHED_IN_MIGRATION()
+          << "Unsupported API type " << static_cast<std::string>(type);
   }
   return nullptr;
 }
diff --git a/content/public/browser/ax_inspect_factory_fuchsia.cc b/content/public/browser/ax_inspect_factory_fuchsia.cc
index d92790f..758cfd43 100644
--- a/content/public/browser/ax_inspect_factory_fuchsia.cc
+++ b/content/public/browser/ax_inspect_factory_fuchsia.cc
@@ -35,7 +35,8 @@
     case ui::AXApiType::kFuchsia:
       return std::make_unique<AccessibilityTreeFormatterFuchsia>();
     default:
-      NOTREACHED() << "Unsupported API type " << static_cast<std::string>(type);
+      NOTREACHED_IN_MIGRATION()
+          << "Unsupported API type " << static_cast<std::string>(type);
   }
   return nullptr;
 }
@@ -55,7 +56,8 @@
     case ui::AXApiType::kFuchsia:
       return std::make_unique<ui::AXEventRecorderFuchsia>(pid, selector);
     default:
-      NOTREACHED() << "Unsupported API type " << static_cast<std::string>(type);
+      NOTREACHED_IN_MIGRATION()
+          << "Unsupported API type " << static_cast<std::string>(type);
   }
   return nullptr;
 }
diff --git a/content/public/browser/ax_inspect_factory_mac.mm b/content/public/browser/ax_inspect_factory_mac.mm
index 9dbe5f6e..abbeee5 100644
--- a/content/public/browser/ax_inspect_factory_mac.mm
+++ b/content/public/browser/ax_inspect_factory_mac.mm
@@ -35,7 +35,7 @@
     case ui::AXApiType::kMac:
       return std::make_unique<ui::AXTreeFormatterMac>();
     default:
-      NOTREACHED() << "Unsupported API type " << type;
+      NOTREACHED_IN_MIGRATION() << "Unsupported API type " << type;
   }
   return nullptr;
 }
@@ -55,7 +55,7 @@
     case ui::AXApiType::kMac:
       return std::make_unique<ui::AXEventRecorderMac>(pid, selector);
     default:
-      NOTREACHED() << "Unsupported API type " << type;
+      NOTREACHED_IN_MIGRATION() << "Unsupported API type " << type;
   }
   return nullptr;
 }
diff --git a/content/public/browser/ax_inspect_factory_win.cc b/content/public/browser/ax_inspect_factory_win.cc
index 84ac6d38..6d6753d 100644
--- a/content/public/browser/ax_inspect_factory_win.cc
+++ b/content/public/browser/ax_inspect_factory_win.cc
@@ -44,7 +44,8 @@
       base::win::AssertComInitialized();
       return std::make_unique<ui::AXTreeFormatterUia>();
     default:
-      NOTREACHED() << "Unsupported API type " << std::string_view(type);
+      NOTREACHED_IN_MIGRATION()
+          << "Unsupported API type " << std::string_view(type);
   }
   return nullptr;
 }
@@ -80,7 +81,8 @@
     case ui::AXApiType::kWinUIA:
       return std::make_unique<ui::AXEventRecorderWinUia>(selector);
     default:
-      NOTREACHED() << "Unsupported API type " << std::string_view(type);
+      NOTREACHED_IN_MIGRATION()
+          << "Unsupported API type " << std::string_view(type);
   }
   return nullptr;
 }
diff --git a/content/public/browser/background_sync_registration.cc b/content/public/browser/background_sync_registration.cc
index f476150..7bd6de6 100644
--- a/content/public/browser/background_sync_registration.cc
+++ b/content/public/browser/background_sync_registration.cc
@@ -26,7 +26,7 @@
     case blink::mojom::BackgroundSyncState::PENDING:
       return false;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
diff --git a/content/public/browser/browser_plugin_guest_delegate.cc b/content/public/browser/browser_plugin_guest_delegate.cc
index 040d36a..5da74522 100644
--- a/content/public/browser/browser_plugin_guest_delegate.cc
+++ b/content/public/browser/browser_plugin_guest_delegate.cc
@@ -8,7 +8,7 @@
 
 std::unique_ptr<WebContents> BrowserPluginGuestDelegate::CreateNewGuestWindow(
     const WebContents::CreateParams& create_params) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
@@ -22,7 +22,7 @@
 
 base::WeakPtr<BrowserPluginGuestDelegate>
 BrowserPluginGuestDelegate::GetGuestDelegateWeakPtr() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 5fa592a..36bf230 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -1056,7 +1056,7 @@
     mojo::PendingRemote<network::mojom::WebSocketHandshakeClient>
         handshake_client) {
   // NOTREACHED because WillInterceptWebSocket returns false.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void ContentBrowserClient::WillCreateWebTransport(
diff --git a/content/public/browser/desktop_media_id.cc b/content/public/browser/desktop_media_id.cc
index f0593ec..9812c74 100644
--- a/content/public/browser/desktop_media_id.cc
+++ b/content/public/browser/desktop_media_id.cc
@@ -104,7 +104,7 @@
   std::string prefix;
   switch (type) {
     case TYPE_NONE:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return std::string();
     case TYPE_SCREEN:
       prefix = kScreenPrefix;
diff --git a/content/public/browser/navigation_throttle.cc b/content/public/browser/navigation_throttle.cc
index e1685be3..678bf170 100644
--- a/content/public/browser/navigation_throttle.cc
+++ b/content/public/browser/navigation_throttle.cc
@@ -24,7 +24,7 @@
     case NavigationThrottle::BLOCK_RESPONSE:
       return net::ERR_BLOCKED_BY_RESPONSE;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return net::ERR_UNEXPECTED;
   }
 }
diff --git a/content/public/browser/web_contents_view_delegate.cc b/content/public/browser/web_contents_view_delegate.cc
index 04b00d1..c6337003 100644
--- a/content/public/browser/web_contents_view_delegate.cc
+++ b/content/public/browser/web_contents_view_delegate.cc
@@ -33,7 +33,7 @@
 
 void WebContentsViewDelegate::ExecuteCommandForTesting(int command_id,
                                                        int event_flags) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void WebContentsViewDelegate::StoreFocus() {
diff --git a/content/public/common/cdm_info.cc b/content/public/common/cdm_info.cc
index 36e73b2..e56ac3c8 100644
--- a/content/public/common/cdm_info.cc
+++ b/content/public/common/cdm_info.cc
@@ -17,7 +17,7 @@
     case CdmInfo::Robustness::kSoftwareSecure:
       return "Software Secure";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 }  // namespace content
\ No newline at end of file
diff --git a/content/public/common/common_param_traits.h b/content/public/common/common_param_traits.h
index aa4e6a9..9bc1b2b 100644
--- a/content/public/common/common_param_traits.h
+++ b/content/public/common/common_param_traits.h
@@ -70,7 +70,7 @@
       memcpy(r, data, sizeof(gfx::NativeWindow));
     } else {
       result = false;
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
     return result;
 #endif
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index ecd7c353..f7f216f 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -659,6 +659,13 @@
              "PrefetchRedirects",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+// Prerender2 support for No-Vary-Search header. Enables prerender matching
+// at navigation time using non-exact URL matching based on the prerender
+// No-Vary-Search header.
+BASE_FEATURE(kPrerender2NoVarySearch,
+             "Prerender2NoVarySearch",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Enables exposure of ads APIs in the renderer: Attribution Reporting,
 // FLEDGE, Topics, along with a number of other features actively in development
 // within these APIs.
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index bac5aeb..5961347 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -160,6 +160,7 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrefetchBrowserInitiatedTriggers);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrefetchNewLimits);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrefetchRedirects);
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrerender2NoVarySearch);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrivacySandboxAdsAPIsOverride);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrivateNetworkAccessForNavigations);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc
index 316dd70d..9a86a5b3 100644
--- a/content/public/test/browser_test_base.cc
+++ b/content/public/test/browser_test_base.cc
@@ -385,9 +385,10 @@
     enable_pixel_output_ = true;
 
   if (command_line->HasSwitch(switches::kDisableGLDrawingForTests)) {
-    NOTREACHED() << "kDisableGLDrawingForTests should not be used as it "
-                    "is chosen by tests. Use kEnablePixelOutputInTests "
-                    "to enable pixel output.";
+    NOTREACHED_IN_MIGRATION()
+        << "kDisableGLDrawingForTests should not be used as it "
+           "is chosen by tests. Use kEnablePixelOutputInTests "
+           "to enable pixel output.";
   }
 
   // Don't enable pixel output for browser tests unless they override and force
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index e2e5d1e..f17d6b5 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -756,7 +756,7 @@
     case network::mojom::ReferrerPolicy::kStrictOriginWhenCrossOrigin:
       return "strict-origin-when-cross-origin";
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return "";
 }
 
@@ -3611,7 +3611,7 @@
         run_loop_disable_log_.Quit();
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
     return;
   }
diff --git a/content/public/test/download_test_observer.cc b/content/public/test/download_test_observer.cc
index 82f7a7f32..e921ef5 100644
--- a/content/public/test/download_test_observer.cc
+++ b/content/public/test/download_test_observer.cc
@@ -178,7 +178,7 @@
         break;
 
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
   }
 
diff --git a/content/public/test/fake_download_item.cc b/content/public/test/fake_download_item.cc
index f2b0d69..22a0cc3 100644
--- a/content/public/test/fake_download_item.cc
+++ b/content/public/test/fake_download_item.cc
@@ -279,29 +279,29 @@
 
 // The methods below are not supported and are not expected to be called.
 void FakeDownloadItem::ValidateDangerousDownload() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FakeDownloadItem::ValidateInsecureDownload() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FakeDownloadItem::StealDangerousDownload(bool delete_file_afterward,
                                               AcquireFileCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   std::move(callback).Run(base::FilePath());
 }
 
 void FakeDownloadItem::Pause() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FakeDownloadItem::Resume(bool user_resume) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FakeDownloadItem::Cancel(bool user_cancel) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FakeDownloadItem::Remove() {
@@ -309,21 +309,21 @@
 }
 
 void FakeDownloadItem::OpenDownload() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FakeDownloadItem::ShowDownloadInShell() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FakeDownloadItem::Rename(const base::FilePath& name,
                               RenameDownloadCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FakeDownloadItem::OnAsyncScanningCompleted(
     download::DownloadDangerType danger_type) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 bool FakeDownloadItem::IsPaused() const {
@@ -331,42 +331,42 @@
 }
 
 bool FakeDownloadItem::AllowMetered() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 bool FakeDownloadItem::IsTemporary() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 bool FakeDownloadItem::RequireSafetyChecks() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 bool FakeDownloadItem::CanResume() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 int64_t FakeDownloadItem::GetBytesWasted() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return 0;
 }
 
 int32_t FakeDownloadItem::GetAutoResumeCount() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return 0;
 }
 
 const GURL& FakeDownloadItem::GetReferrerUrl() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return dummy_url;
 }
 
 const std::string& FakeDownloadItem::GetSerializedEmbedderDownloadData() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return serialized_embedder_download_data;
 }
 
@@ -375,48 +375,48 @@
 }
 
 const GURL& FakeDownloadItem::GetTabReferrerUrl() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return dummy_url;
 }
 
 const std::optional<url::Origin>& FakeDownloadItem::GetRequestInitiator()
     const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return dummy_origin;
 }
 
 std::string FakeDownloadItem::GetSuggestedFilename() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::string();
 }
 
 std::string FakeDownloadItem::GetContentDisposition() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::string();
 }
 
 std::string FakeDownloadItem::GetOriginalMimeType() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::string();
 }
 
 std::string FakeDownloadItem::GetRemoteAddress() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::string();
 }
 
 bool FakeDownloadItem::HasUserGesture() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 ui::PageTransition FakeDownloadItem::GetTransitionType() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return ui::PageTransition();
 }
 
 bool FakeDownloadItem::IsSavePackageDownload() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -429,23 +429,23 @@
 }
 
 const base::FilePath& FakeDownloadItem::GetForcedFilePath() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return dummy_file_path;
 }
 
 base::FilePath FakeDownloadItem::GetTemporaryFilePath() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return dummy_file_path;
 }
 
 base::FilePath FakeDownloadItem::GetFileNameToReportUser() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return base::FilePath();
 }
 
 download::DownloadItem::TargetDisposition
 FakeDownloadItem::GetTargetDisposition() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return TargetDisposition();
 }
 
@@ -454,7 +454,7 @@
 }
 
 void FakeDownloadItem::DeleteFile(base::OnceCallback<void(bool)> callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 download::DownloadFile* FakeDownloadItem::GetDownloadFile() {
@@ -489,17 +489,17 @@
 }
 
 bool FakeDownloadItem::TimeRemaining(base::TimeDelta* remaining) const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 int64_t FakeDownloadItem::CurrentSpeed() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return 1;
 }
 
 bool FakeDownloadItem::AllDataSaved() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return true;
 }
 
@@ -509,63 +509,63 @@
 
 const std::vector<download::DownloadItem::ReceivedSlice>&
 FakeDownloadItem::GetReceivedSlices() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   static const std::vector<download::DownloadItem::ReceivedSlice> slices;
   return slices;
 }
 
 bool FakeDownloadItem::CanShowInFolder() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return true;
 }
 
 bool FakeDownloadItem::CanOpenDownload() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return true;
 }
 
 bool FakeDownloadItem::ShouldOpenFileBasedOnExtension() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return true;
 }
 
 bool FakeDownloadItem::ShouldOpenFileByPolicyBasedOnExtension() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return true;
 }
 
 bool FakeDownloadItem::GetAutoOpened() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 bool FakeDownloadItem::GetOpened() const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 void FakeDownloadItem::OnContentCheckCompleted(
     download::DownloadDangerType danger_type,
     download::DownloadInterruptReason reason) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FakeDownloadItem::SetOpened(bool opened) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FakeDownloadItem::SetDisplayName(const base::FilePath& name) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 std::string FakeDownloadItem::DebugString(bool verbose) const {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::string();
 }
 
 void FakeDownloadItem::SimulateErrorForTesting(
     download::DownloadInterruptReason reason) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 }  // namespace content
diff --git a/content/public/test/fake_service_worker_context.cc b/content/public/test/fake_service_worker_context.cc
index 492c1e1f..24a3e35 100644
--- a/content/public/test/fake_service_worker_context.cc
+++ b/content/public/test/fake_service_worker_context.cc
@@ -34,45 +34,45 @@
     const blink::StorageKey& key,
     const blink::mojom::ServiceWorkerRegistrationOptions& options,
     StatusCodeCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 void FakeServiceWorkerContext::UnregisterServiceWorker(
     const GURL& scope,
     const blink::StorageKey& key,
     ResultCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 void FakeServiceWorkerContext::UnregisterServiceWorkerImmediately(
     const GURL& scope,
     const blink::StorageKey& key,
     ResultCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 ServiceWorkerExternalRequestResult
 FakeServiceWorkerContext::StartingExternalRequest(
     int64_t service_worker_version_id,
     ServiceWorkerExternalRequestTimeoutType timeout_type,
     const base::Uuid& request_uuid) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return ServiceWorkerExternalRequestResult::kWorkerNotFound;
 }
 ServiceWorkerExternalRequestResult
 FakeServiceWorkerContext::FinishedExternalRequest(
     int64_t service_worker_version_id,
     const base::Uuid& request_uuid) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return ServiceWorkerExternalRequestResult::kWorkerNotFound;
 }
 size_t FakeServiceWorkerContext::CountExternalRequestsForTest(
     const blink::StorageKey& key) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return 0u;
 }
 bool FakeServiceWorkerContext::ExecuteScriptForTest(
     const std::string& script,
     int64_t version_id,
     ServiceWorkerScriptExecutionCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 bool FakeServiceWorkerContext::MaybeHasRegistrationForStorageKey(
@@ -81,45 +81,45 @@
 }
 void FakeServiceWorkerContext::GetAllStorageKeysInfo(
     GetUsageInfoCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 void FakeServiceWorkerContext::DeleteForStorageKey(const blink::StorageKey& key,
                                                    ResultCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 void FakeServiceWorkerContext::CheckHasServiceWorker(
     const GURL& url,
     const blink::StorageKey& key,
     CheckHasServiceWorkerCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 void FakeServiceWorkerContext::CheckOfflineCapability(
     const GURL& url,
     const blink::StorageKey& key,
     const ServiceWorkerContext::CheckOfflineCapabilityCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 void FakeServiceWorkerContext::ClearAllServiceWorkersForTest(
     base::OnceClosure) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 void FakeServiceWorkerContext::StartWorkerForScope(
     const GURL& scope,
     const blink::StorageKey& key,
     ServiceWorkerContext::StartWorkerCallback info_callback,
     ServiceWorkerContext::StatusCodeCallback failure_callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 bool FakeServiceWorkerContext::IsLiveStartingServiceWorker(
     int64_t service_worker_version_id) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
 bool FakeServiceWorkerContext::IsLiveRunningServiceWorker(
     int64_t service_worker_version_id) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -146,7 +146,7 @@
     const GURL& document_url,
     const blink::StorageKey& key,
     WarmUpServiceWorkerCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void FakeServiceWorkerContext::StartServiceWorkerAndDispatchMessage(
@@ -164,12 +164,12 @@
 }
 
 void FakeServiceWorkerContext::StopAllServiceWorkers(base::OnceClosure) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 const base::flat_map<int64_t, ServiceWorkerRunningInfo>&
 FakeServiceWorkerContext::GetRunningServiceWorkerInfos() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   static const base::NoDestructor<
       base::flat_map<int64_t, ServiceWorkerRunningInfo>>
       empty_running_workers;
diff --git a/content/public/test/mock_render_thread.cc b/content/public/test/mock_render_thread.cc
index be35615..44316e8 100644
--- a/content/public/test/mock_render_thread.cc
+++ b/content/public/test/mock_render_thread.cc
@@ -108,7 +108,7 @@
       return;
     }
   }
-  NOTREACHED() << "filter to be removed not found";
+  NOTREACHED_IN_MIGRATION() << "filter to be removed not found";
 }
 
 #endif
diff --git a/content/public/test/prerender_test_util.cc b/content/public/test/prerender_test_util.cc
index d78a1af..a632fa0 100644
--- a/content/public/test/prerender_test_util.cc
+++ b/content/public/test/prerender_test_util.cc
@@ -683,7 +683,7 @@
       DCHECK(!embedder_suffix.empty());
       return std::string(histogram_base_name) + ".Embedder_" + embedder_suffix;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 ScopedPrerenderWebContentsDelegate::ScopedPrerenderWebContentsDelegate(
diff --git a/content/public/test/scoped_web_ui_controller_factory_registration.cc b/content/public/test/scoped_web_ui_controller_factory_registration.cc
index 104b6c22..74ffe754 100644
--- a/content/public/test/scoped_web_ui_controller_factory_registration.cc
+++ b/content/public/test/scoped_web_ui_controller_factory_registration.cc
@@ -35,7 +35,7 @@
     return;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 }  // namespace
diff --git a/content/public/test/shared_storage_test_utils.cc b/content/public/test/shared_storage_test_utils.cc
index b74ed7f..25ad41b38 100644
--- a/content/public/test/shared_storage_test_utils.cc
+++ b/content/public/test/shared_storage_test_utils.cc
@@ -45,7 +45,7 @@
     case OperationType::kClear:
       return "Clear";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return "None";
 }
@@ -73,7 +73,7 @@
     case OperationResult::kExpired:
       return "Expired";
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return "None";
 }
diff --git a/content/public/test/test_devtools_protocol_client.cc b/content/public/test/test_devtools_protocol_client.cc
index 4ea3a66f..7ecf8f1 100644
--- a/content/public/test/test_devtools_protocol_client.cc
+++ b/content/public/test/test_devtools_protocol_client.cc
@@ -183,7 +183,7 @@
 void TestDevToolsProtocolClient::AgentHostClosed(
     DevToolsAgentHost* agent_host) {
   if (!agent_host_can_close_)
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 }
 
 bool TestDevToolsProtocolClient::AllowUnsafeOperations() {
diff --git a/content/public/test/test_fileapi_operation_waiter.cc b/content/public/test/test_fileapi_operation_waiter.cc
index 8f34acf..37bce61d 100644
--- a/content/public/test/test_fileapi_operation_waiter.cc
+++ b/content/public/test/test_fileapi_operation_waiter.cc
@@ -26,7 +26,7 @@
     bool has_more) {
   // blink::mojom::FileSystemManager::ReadDirectory isn't being called by tests
   // right now, so this callback shouldn't be called.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void TestFileapiOperationWaiter::ErrorOccurred(base::File::Error error_code) {
diff --git a/content/public/test/test_storage_partition.cc b/content/public/test/test_storage_partition.cc
index cae9a1e..8e630df2 100644
--- a/content/public/test/test_storage_partition.cc
+++ b/content/public/test/test_storage_partition.cc
@@ -53,7 +53,7 @@
 void TestStoragePartition::CreateTrustTokenQueryAnswerer(
     mojo::PendingReceiver<network::mojom::TrustTokenQueryAnswerer> receiver,
     const url::Origin& top_frame_origin) {
-  NOTREACHED() << "Not implemented.";
+  NOTREACHED_IN_MIGRATION() << "Not implemented.";
 }
 
 mojo::PendingRemote<network::mojom::URLLoaderNetworkServiceObserver>
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index 921a039..40a956b 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -162,7 +162,8 @@
 
   if (old_mode == mode) {
     DCHECK(ax_context_);
-    NOTREACHED() << "Do not call AccessibilityModeChanged unless it changes.";
+    NOTREACHED_IN_MIGRATION()
+        << "Do not call AccessibilityModeChanged unless it changes.";
     return;
   }
 
@@ -371,7 +372,7 @@
     case ax::mojom::Action::kHitTest:
     case ax::mojom::Action::kReplaceSelectedText:
     case ax::mojom::Action::kNone:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     case ax::mojom::Action::kGetTextLocation:
       break;
diff --git a/content/renderer/dom_automation_controller.cc b/content/renderer/dom_automation_controller.cc
index 526e4e5..90f6434 100644
--- a/content/renderer/dom_automation_controller.cc
+++ b/content/renderer/dom_automation_controller.cc
@@ -102,7 +102,8 @@
     value =
         conv.FromV8Value(args.PeekNext(), args.isolate()->GetCurrentContext());
   } else {
-    NOTREACHED() << "No arguments passed to domAutomationController.send";
+    NOTREACHED_IN_MIGRATION()
+        << "No arguments passed to domAutomationController.send";
     return false;
   }
 
diff --git a/content/renderer/gpu_benchmarking_extension.cc b/content/renderer/gpu_benchmarking_extension.cc
index b584ad6..45fbfdb 100644
--- a/content/renderer/gpu_benchmarking_extension.cc
+++ b/content/renderer/gpu_benchmarking_extension.cc
@@ -153,7 +153,7 @@
     case content::mojom::GestureSourceType::kPenInput:
       return 3;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return 0;
 }
 
@@ -368,7 +368,7 @@
     return blink::WebInputEvent::kNumLockOn;
   if (key == "AltGraph")
     return blink::WebInputEvent::kAltGrKey;
-  NOTREACHED() << "invalid key modifier";
+  NOTREACHED_IN_MIGRATION() << "invalid key modifier";
   return 0;
 }
 
@@ -383,7 +383,7 @@
     return blink::WebMouseEvent::kBackButtonDown;
   if (button == "Forward")
     return blink::WebMouseEvent::kForwardButtonDown;
-  NOTREACHED() << "invalid button modifier";
+  NOTREACHED_IN_MIGRATION() << "invalid button modifier";
   return 0;
 }
 
diff --git a/content/renderer/java/gin_java_bridge_value_converter.cc b/content/renderer/java/gin_java_bridge_value_converter.cc
index 650e2050..75b545d9 100644
--- a/content/renderer/java/gin_java_bridge_value_converter.cc
+++ b/content/renderer/java/gin_java_bridge_value_converter.cc
@@ -132,7 +132,7 @@
   } else if (typed_array->IsFloat64Array()) {
     return TypedArraySerializerImpl<double, double>::Create(typed_array);
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
diff --git a/content/renderer/media/media_permission_dispatcher.cc b/content/renderer/media/media_permission_dispatcher.cc
index fde965f..c4a3aa3c 100644
--- a/content/renderer/media/media_permission_dispatcher.cc
+++ b/content/renderer/media/media_permission_dispatcher.cc
@@ -36,7 +36,7 @@
       descriptor->name = blink::mojom::PermissionName::VIDEO_CAPTURE;
       break;
     default:
-      NOTREACHED() << base::to_underlying(type);
+      NOTREACHED_IN_MIGRATION() << base::to_underlying(type);
       descriptor->name =
           blink::mojom::PermissionName::PROTECTED_MEDIA_IDENTIFIER;
   }
diff --git a/content/renderer/media/renderer_webaudiodevice_impl.cc b/content/renderer/media/renderer_webaudiodevice_impl.cc
index 8290594..0057acc 100644
--- a/content/renderer/media/renderer_webaudiodevice_impl.cc
+++ b/content/renderer/media/renderer_webaudiodevice_impl.cc
@@ -94,7 +94,7 @@
           hardware_capabilities.max_frames_per_buffer,
           media::limits::kMaxWebAudioBufferSize);
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   return 0;
 }
diff --git a/content/renderer/net_info_helper.cc b/content/renderer/net_info_helper.cc
index 67a7898..0e0e4a3 100644
--- a/content/renderer/net_info_helper.cc
+++ b/content/renderer/net_info_helper.cc
@@ -30,7 +30,7 @@
       return blink::kWebConnectionTypeBluetooth;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return blink::kWebConnectionTypeNone;
 }
 
diff --git a/content/renderer/pepper/content_renderer_pepper_host_factory.cc b/content/renderer/pepper/content_renderer_pepper_host_factory.cc
index 54379d58..19b8282 100644
--- a/content/renderer/pepper/content_renderer_pepper_host_factory.cc
+++ b/content/renderer/pepper/content_renderer_pepper_host_factory.cc
@@ -93,7 +93,7 @@
       std::string internal_path;
       if (!UnpackMessage<PpapiHostMsg_FileRef_CreateForFileAPI>(
               message, &file_system, &internal_path)) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return nullptr;
       }
       return std::make_unique<PepperFileRefRendererHost>(
@@ -103,7 +103,7 @@
       PP_FileSystemType file_system_type;
       if (!UnpackMessage<PpapiHostMsg_FileSystem_Create>(message,
                                                          &file_system_type)) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return nullptr;
       }
       return std::make_unique<PepperFileSystemHost>(host_, instance, resource,
@@ -114,7 +114,7 @@
       PP_Bool is_always_opaque;
       if (!UnpackMessage<PpapiHostMsg_Graphics2D_Create>(
               message, &size, &is_always_opaque)) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return nullptr;
       }
       ppapi::PPB_ImageData_Shared::ImageDataType image_type =
diff --git a/content/renderer/pepper/event_conversion.cc b/content/renderer/pepper/event_conversion.cc
index ae00ba0..e99b115 100644
--- a/content/renderer/pepper/event_conversion.cc
+++ b/content/renderer/pepper/event_conversion.cc
@@ -398,7 +398,7 @@
       state = WebTouchPoint::State::kStateCancelled;
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   WebTouchEventTraits::ResetType(
       type, base::TimeTicks() + base::Seconds(event.event_time_stamp),
@@ -429,7 +429,7 @@
       type = WebInputEvent::Type::kKeyUp;
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   WebKeyboardEvent* key_event = new WebKeyboardEvent(
       type, event.event_modifiers,
@@ -477,7 +477,7 @@
       type = WebInputEvent::Type::kContextMenu;
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   WebMouseEvent* mouse_event = new WebMouseEvent(
       type, event.event_modifiers,
@@ -667,7 +667,7 @@
     case PP_INPUTEVENT_TYPE_IME_TEXT:
       // TODO(kinaba) implement in WebKit an event structure to handle
       // composition events.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
     case PP_INPUTEVENT_TYPE_TOUCHSTART:
     case PP_INPUTEVENT_TYPE_TOUCHMOVE:
diff --git a/content/renderer/pepper/host_globals.cc b/content/renderer/pepper/host_globals.cc
index bb949ee7..c524855 100644
--- a/content/renderer/pepper/host_globals.cc
+++ b/content/renderer/pepper/host_globals.cc
@@ -211,7 +211,7 @@
       << module << " is not a PP_Module.";
   auto found = module_map_.find(module);
   if (found == module_map_.end()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   module_map_.erase(found);
diff --git a/content/renderer/pepper/host_var_tracker.cc b/content/renderer/pepper/host_var_tracker.cc
index c49afc49..34fe20a5 100644
--- a/content/renderer/pepper/host_var_tracker.cc
+++ b/content/renderer/pepper/host_var_tracker.cc
@@ -133,7 +133,7 @@
   object_var->InstanceDeleted();
   auto iter = live_vars_.find(object_var->GetExistingVarID());
   if (iter == live_vars_.end()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   iter->second.ref_count = 0;
diff --git a/content/renderer/pepper/message_channel.cc b/content/renderer/pepper/message_channel.cc
index 072bf42..5815769 100644
--- a/content/renderer/pepper/message_channel.cc
+++ b/content/renderer/pepper/message_channel.cc
@@ -171,7 +171,7 @@
   if (key_string) {
     internal_named_properties_[key_string->value()] = ScopedPPVar(value);
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
@@ -284,7 +284,7 @@
 
   v8::Local<v8::Value> message_data;
   if (!args->GetNext(&message_data)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   EnqueuePluginMessage(args->isolate(), message_data);
@@ -303,7 +303,7 @@
 
   v8::Local<v8::Value> message_data;
   if (!args->GetNext(&message_data)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   if (plugin_message_queue_state_ == WAITING_TO_START) {
diff --git a/content/renderer/pepper/pepper_audio_input_host.cc b/content/renderer/pepper/pepper_audio_input_host.cc
index bae18a3a..8a3ec91 100644
--- a/content/renderer/pepper/pepper_audio_input_host.cc
+++ b/content/renderer/pepper/pepper_audio_input_host.cc
@@ -118,7 +118,7 @@
   base::SyncSocket scoped_socket(std::move(socket_handle));
 
   if (!open_context_.is_valid()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
diff --git a/content/renderer/pepper/pepper_audio_output_host.cc b/content/renderer/pepper/pepper_audio_output_host.cc
index ba572f9..b9893754 100644
--- a/content/renderer/pepper/pepper_audio_output_host.cc
+++ b/content/renderer/pepper/pepper_audio_output_host.cc
@@ -139,7 +139,7 @@
   base::SyncSocket scoped_socket(std::move(socket_handle));
 
   if (!open_context_.is_valid()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
diff --git a/content/renderer/pepper/pepper_browser_connection.cc b/content/renderer/pepper/pepper_browser_connection.cc
index b8b4ac87..e5b763bc 100644
--- a/content/renderer/pepper/pepper_browser_connection.cc
+++ b/content/renderer/pepper/pepper_browser_connection.cc
@@ -93,7 +93,7 @@
     std::move(it->second).Run(pending_resource_host_ids);
     pending_create_map_.erase(it);
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/renderer/pepper/pepper_file_ref_renderer_host.cc b/content/renderer/pepper/pepper_file_ref_renderer_host.cc
index ad135f4..cfe20e92 100644
--- a/content/renderer/pepper/pepper_file_ref_renderer_host.cc
+++ b/content/renderer/pepper/pepper_file_ref_renderer_host.cc
@@ -71,7 +71,7 @@
     const IPC::Message& msg,
     ppapi::host::HostMessageContext* context) {
   // We don't handle any messages from the plugin in this host.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return PP_ERROR_FAILED;
 }
 
diff --git a/content/renderer/pepper/pepper_in_process_router.cc b/content/renderer/pepper/pepper_in_process_router.cc
index 715e8f8..a4af457a 100644
--- a/content/renderer/pepper/pepper_in_process_router.cc
+++ b/content/renderer/pepper/pepper_in_process_router.cc
@@ -75,14 +75,14 @@
     // Resource reply from the renderer (no routing id).
     if (!UnpackMessage<PpapiPluginMsg_ResourceReply>(
             msg, &reply_params, &nested_msg)) {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return false;
     }
   } else if (msg.type() == PpapiHostMsg_InProcessResourceReply::ID) {
     // Resource reply from the browser (has a routing id).
     if (!UnpackMessage<PpapiHostMsg_InProcessResourceReply>(
             msg, &reply_params, &nested_msg)) {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return false;
     }
   } else {
diff --git a/content/renderer/pepper/pepper_media_device_manager.cc b/content/renderer/pepper/pepper_media_device_manager.cc
index da39a08..36ae7b6 100644
--- a/content/renderer/pepper/pepper_media_device_manager.cc
+++ b/content/renderer/pepper/pepper_media_device_manager.cc
@@ -40,7 +40,7 @@
     case MediaDeviceType::kMediaAudioOuput:
       return PP_DEVICETYPE_DEV_AUDIOOUTPUT;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return PP_DEVICETYPE_DEV_INVALID;
   }
 }
@@ -54,7 +54,7 @@
     case PP_DEVICETYPE_DEV_AUDIOOUTPUT:
       return MediaDeviceType::kMediaAudioOuput;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return MediaDeviceType::kMediaAudioOuput;
   }
 }
@@ -209,7 +209,7 @@
       return GetMediaStreamDeviceObserver()->GetVideoSessionId(
           blink::WebString::FromUTF8(label));
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return base::UnguessableToken();
   }
 }
@@ -225,7 +225,7 @@
     case PP_DEVICETYPE_DEV_VIDEOCAPTURE:
       return blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return blink::mojom::MediaStreamType::NO_SERVICE;
   }
 }
diff --git a/content/renderer/pepper/pepper_media_stream_video_track_host.cc b/content/renderer/pepper/pepper_media_stream_video_track_host.cc
index 7ec88a6..6f9e3135 100644
--- a/content/renderer/pepper/pepper_media_stream_video_track_host.cc
+++ b/content/renderer/pepper/pepper_media_stream_video_track_host.cc
@@ -154,7 +154,7 @@
                        src_halfheight, dst, dst_halfwidth, dst_halfwidth,
                        dst_halfheight, kFilterMode);
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/renderer/pepper/pepper_platform_audio_output.cc b/content/renderer/pepper/pepper_platform_audio_output.cc
index ef9f8be..68791b5 100644
--- a/content/renderer/pepper/pepper_platform_audio_output.cc
+++ b/content/renderer/pepper/pepper_platform_audio_output.cc
@@ -83,7 +83,7 @@
     media::OutputDeviceStatus device_status,
     const media::AudioParameters& output_params,
     const std::string& matched_device_id) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void PepperPlatformAudioOutput::OnStreamCreated(
diff --git a/content/renderer/pepper/pepper_platform_audio_output_dev.cc b/content/renderer/pepper/pepper_platform_audio_output_dev.cc
index 1198e97..82027e4 100644
--- a/content/renderer/pepper/pepper_platform_audio_output_dev.cc
+++ b/content/renderer/pepper/pepper_platform_audio_output_dev.cc
@@ -335,7 +335,7 @@
     case CREATING_STREAM:
     case PAUSED:
     case PLAYING:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       break;
   }
 }
diff --git a/content/renderer/pepper/pepper_platform_video_capture.cc b/content/renderer/pepper/pepper_platform_video_capture.cc
index 9b1e89b..85c11f759 100644
--- a/content/renderer/pepper/pepper_platform_video_capture.cc
+++ b/content/renderer/pepper/pepper_platform_video_capture.cc
@@ -140,7 +140,7 @@
       handler_->OnError();
       break;
     default:
-      NOTREACHED() << "Unexpected state: " << state << ".";
+      NOTREACHED_IN_MIGRATION() << "Unexpected state: " << state << ".";
   }
 }
 
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index 1a175e4..10bd75f 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -350,7 +350,7 @@
 
   BufferAutoMapper mapper(enter.object());
   if (!mapper.data() || !mapper.size()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
@@ -485,7 +485,7 @@
     PP_Instance instance,
     PP_GamepadsSampleData* data) {
   // This gamepad singleton resource method should not be called
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 PepperPluginInstanceImpl::PepperPluginInstanceImpl(
@@ -1113,7 +1113,7 @@
   if (!dispatcher || (message.get().type == PP_VARTYPE_OBJECT)) {
     // The dispatcher should always be valid, and MessageChannel should never
     // send an 'object' var over PPP_Messaging.
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   dispatcher->Send(new PpapiMsg_PPPMessaging_HandleMessage(
@@ -1133,7 +1133,7 @@
   if (!dispatcher || (message.get().type == PP_VARTYPE_OBJECT)) {
     // The dispatcher should always be valid, and MessageChannel should never
     // send an 'object' var over PPP_Messaging.
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return false;
   }
   ppapi::proxy::ReceiveSerializedVarReturnValue msg_reply;
@@ -1604,7 +1604,7 @@
   if (!GetPreferredPrintOutputFormat(&format, print_params)) {
     // PrintBegin should not have been called since SupportsPrintInterface
     // would have returned false;
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return 0;
   }
 
@@ -1848,7 +1848,7 @@
   WebWidget* widget =
       container()->GetDocument().GetFrame()->LocalRoot()->FrameWidget();
   if (!widget) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
@@ -2143,7 +2143,7 @@
     }
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
diff --git a/content/renderer/pepper/pepper_video_decoder_host.cc b/content/renderer/pepper/pepper_video_decoder_host.cc
index 37804b9..b03d84c 100644
--- a/content/renderer/pepper/pepper_video_decoder_host.cc
+++ b/content/renderer/pepper/pepper_video_decoder_host.cc
@@ -494,7 +494,7 @@
     int32_t bitstream_buffer_id) {
   auto it = GetPendingDecodeById(bitstream_buffer_id);
   if (it == pending_decodes_.end()) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   host()->SendReply(it->reply_context,
diff --git a/content/renderer/pepper/pepper_video_encoder_host.cc b/content/renderer/pepper/pepper_video_encoder_host.cc
index 084afaf7..3b2220a3 100644
--- a/content/renderer/pepper/pepper_video_encoder_host.cc
+++ b/content/renderer/pepper/pepper_video_encoder_host.cc
@@ -103,7 +103,7 @@
     case media::VP9PROFILE_PROFILE0:
       return PP_VIDEOPROFILE_VP9_ANY;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return static_cast<PP_VideoProfile>(-1);
   }
 }
@@ -454,7 +454,7 @@
   // Frames have already been allocated.
   if (buffer_manager_.number_of_buffers() > 0) {
     SendGetFramesErrorReply(PP_ERROR_FAILED);
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
diff --git a/content/renderer/pepper/plugin_object.cc b/content/renderer/pepper/plugin_object.cc
index 0ac5434d..cc5d81d 100644
--- a/content/renderer/pepper/plugin_object.cc
+++ b/content/renderer/pepper/plugin_object.cc
@@ -265,7 +265,7 @@
   for (uint32_t i = 0; i < argument_vars.size(); ++i) {
     v8::Local<v8::Value> arg;
     if (!args->GetNext(&arg)) {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
 
     argument_vars.Set(i, try_catch.FromV8(arg));
diff --git a/content/renderer/pepper/ppb_image_data_impl.cc b/content/renderer/pepper/ppb_image_data_impl.cc
index 5137727..0877c41d 100644
--- a/content/renderer/pepper/ppb_image_data_impl.cc
+++ b/content/renderer/pepper/ppb_image_data_impl.cc
@@ -42,7 +42,7 @@
       return;
       // No default: so that we get a compiler warning if any types are added.
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance, ForTest)
diff --git a/content/renderer/pepper/ppb_var_deprecated_impl.cc b/content/renderer/pepper/ppb_var_deprecated_impl.cc
index 5e6233dc..d0805f02 100644
--- a/content/renderer/pepper/ppb_var_deprecated_impl.cc
+++ b/content/renderer/pepper/ppb_var_deprecated_impl.cc
@@ -344,7 +344,7 @@
 
 PP_Var Construct(PP_Var var, uint32_t argc, PP_Var* argv, PP_Var* exception) {
   // Deprecated.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return PP_MakeUndefined();
 }
 
diff --git a/content/renderer/pepper/resource_converter.cc b/content/renderer/pepper/resource_converter.cc
index 0e5435b7..be47d4c6 100644
--- a/content/renderer/pepper/resource_converter.cc
+++ b/content/renderer/pepper/resource_converter.cc
@@ -57,7 +57,7 @@
     case blink::WebFileSystemType::kWebFileSystemTypeExternal:
       return PP_FILESYSTEMTYPE_EXTERNAL;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return PP_FILESYSTEMTYPE_LOCALTEMPORARY;
   }
 }
@@ -291,7 +291,7 @@
 
   ResourceVar* resource = ResourceVar::FromPPVar(var);
   if (!resource) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return false;
   }
   PP_Resource resource_id = resource->GetPPResource();
@@ -303,7 +303,7 @@
     // This should never happen: the RendererPpapiHost is owned by the module
     // and should outlive instances associated with it. However, if it doesn't
     // for some reason, we do not want to crash.
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return false;
   }
   ::ppapi::host::PpapiHost* ppapi_host = renderer_ppapi_host->GetPpapiHost();
diff --git a/content/renderer/pepper/url_request_info_util.cc b/content/renderer/pepper/url_request_info_util.cc
index 67851a4..32945492 100644
--- a/content/renderer/pepper/url_request_info_util.cc
+++ b/content/renderer/pepper/url_request_info_util.cc
@@ -106,7 +106,7 @@
       platform_path = file_ref_host->GetExternalFilePath();
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   std::optional<base::Time> optional_modified_time;
   if (expected_last_modified_time != 0)
diff --git a/content/renderer/pepper/v8_var_converter.cc b/content/renderer/pepper/v8_var_converter.cc
index d0c037b..505cc1884 100644
--- a/content/renderer/pepper/v8_var_converter.cc
+++ b/content/renderer/pepper/v8_var_converter.cc
@@ -130,7 +130,7 @@
     case PP_VARTYPE_STRING: {
       StringVar* string = StringVar::FromPPVar(var);
       if (!string) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         result->Clear();
         return false;
       }
@@ -148,7 +148,7 @@
     case PP_VARTYPE_ARRAY_BUFFER: {
       ArrayBufferVar* buffer = ArrayBufferVar::FromPPVar(var);
       if (!buffer) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         result->Clear();
         return false;
       }
@@ -170,13 +170,13 @@
       // is nested inside an array or dictionary.
       if (object_vars_allowed == V8VarConverter::kDisallowObjectVars ||
           visited_ids->size() != 0) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         result->Clear();
         return false;
       }
       scoped_refptr<V8ObjectVar> v8_object_var = V8ObjectVar::FromPPVar(var);
       if (!v8_object_var.get()) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         result->Clear();
         return false;
       }
@@ -376,7 +376,7 @@
       parent_ids.insert(stack[current_var_index].val.value.as_id);
       ArrayVar* array_var = ArrayVar::FromPPVar(stack[current_var_index].val);
       if (!array_var) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return false;
       }
       DCHECK(current_v8->IsArray());
@@ -408,7 +408,7 @@
       DictionaryVar* dict_var =
           DictionaryVar::FromPPVar(stack[current_var_index].val);
       if (!dict_var) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return false;
       }
       DCHECK(current_v8->IsObject());
@@ -538,7 +538,7 @@
 
       ArrayVar* array_var = ArrayVar::FromPPVar(current_var);
       if (!array_var) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return false;
       }
 
@@ -574,7 +574,7 @@
 
       DictionaryVar* dict_var = DictionaryVar::FromPPVar(current_var);
       if (!dict_var) {
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return false;
       }
 
@@ -586,9 +586,10 @@
 
         // Extend this test to cover more types as necessary and if sensible.
         if (!key->IsString() && !key->IsNumber()) {
-          NOTREACHED() << "Key \"" << *v8::String::Utf8Value(isolate, key)
-                       << "\" "
-                          "is neither a string nor a number";
+          NOTREACHED_IN_MIGRATION()
+              << "Key \"" << *v8::String::Utf8Value(isolate, key)
+              << "\" "
+                 "is neither a string nor a number";
           return false;
         }
 
diff --git a/content/renderer/pepper/v8_var_converter_unittest.cc b/content/renderer/pepper/v8_var_converter_unittest.cc
index 1df5824..e05e7f8 100644
--- a/content/renderer/pepper/v8_var_converter_unittest.cc
+++ b/content/renderer/pepper/v8_var_converter_unittest.cc
@@ -61,7 +61,7 @@
 
 void FromV8ValueComplete(const ScopedPPVar& scoped_var,
                          bool success) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 class MockResourceConverter : public content::ResourceConverter {
diff --git a/content/renderer/pepper/video_decoder_shim.cc b/content/renderer/pepper/video_decoder_shim.cc
index e354107..c209796 100644
--- a/content/renderer/pepper/video_decoder_shim.cc
+++ b/content/renderer/pepper/video_decoder_shim.cc
@@ -384,7 +384,7 @@
   if (it != timestamp_to_id_cache_.end()) {
     decode_id = it->second;
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
 
diff --git a/content/renderer/pepper/video_encoder_shim.cc b/content/renderer/pepper/video_encoder_shim.cc
index 819be379..1f65d16 100644
--- a/content/renderer/pepper/video_encoder_shim.cc
+++ b/content/renderer/pepper/video_encoder_shim.cc
@@ -93,7 +93,7 @@
       *min_quantizer = 0;
       *max_quantizer = 0;
       *cpu_used = 0;
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 }
 
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 70a883c..fd027ac 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -692,7 +692,7 @@
                  : WebFrameLoadType::kStandard;
 
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return WebFrameLoadType::kStandard;
   }
 }
@@ -1177,7 +1177,7 @@
           FRAME_DELETE_INTENTION_SPECULATIVE_MAIN_FRAME_FOR_NAVIGATION_CANCELLED;
   }
   // All cases should've been handled by the switch case above.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return ProtoLevel::FRAME_DELETE_INTENTION_NOT_MAIN_FRAME;
 }
 
@@ -1255,7 +1255,7 @@
     case blink::kWebNavigationPolicyPictureInPicture:
       return WindowOpenDisposition::NEW_PICTURE_IN_PICTURE;
   }
-  NOTREACHED() << "Unexpected WebNavigationPolicy";
+  NOTREACHED_IN_MIGRATION() << "Unexpected WebNavigationPolicy";
   return WindowOpenDisposition::IGNORE_ACTION;
 }
 
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc
index 7afbd1c..a2ec2ea 100644
--- a/content/renderer/render_process_impl.cc
+++ b/content/renderer/render_process_impl.cc
@@ -224,11 +224,11 @@
 }
 
 void RenderProcessImpl::AddRefProcess() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void RenderProcessImpl::ReleaseProcess() {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 }  // namespace content
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index da4a841..9dd563c 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -1306,7 +1306,7 @@
   // caused race conditions, where the browser process was reusing renderer
   // processes that were shutting down.
   // See https://crbug.com/535246 or https://crbug.com/873541/#c8.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 #if BUILDFLAG(CONTENT_ENABLE_LEGACY_IPC)
@@ -1479,7 +1479,7 @@
     main_thread_scheduler_->ResumeTimersForAndroidWebView();
   }
 #else
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 #endif
 }
 
@@ -1499,7 +1499,7 @@
 #if BUILDFLAG(IS_APPLE)
   is_elastic_overscroll_enabled_ = params->scroll_view_rubber_banding;
 #else
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 #endif  // BUILDFLAG(IS_APPLE)
 }
 
@@ -1511,7 +1511,7 @@
   // that rely on system colors, such as the accent and highlight colors.
   blink::SystemColorsChanged();
 #else
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 #endif
 }
 
@@ -1538,7 +1538,7 @@
   for (auto& observer : observers_)
     observer.PluginListChanged();
 #else
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 #endif
 }
 
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index c053926..6c317b6 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -168,7 +168,7 @@
     case blink::Platform::kWebGPUContextType:
       return gpu::CONTEXT_TYPE_WEBGPU;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return gpu::CONTEXT_TYPE_OPENGLES2;
 }
 
diff --git a/content/renderer/service_worker/controller_service_worker_connector.cc b/content/renderer/service_worker/controller_service_worker_connector.cc
index 3ec1322..db87874e 100644
--- a/content/renderer/service_worker/controller_service_worker_connector.cc
+++ b/content/renderer/service_worker/controller_service_worker_connector.cc
@@ -76,7 +76,7 @@
       DCHECK(!container_host_);
       return nullptr;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 }
 
diff --git a/content/renderer/service_worker/service_worker_provider_context_unittest.cc b/content/renderer/service_worker/service_worker_provider_context_unittest.cc
index d244a5b..15a69c3 100644
--- a/content/renderer/service_worker/service_worker_provider_context_unittest.cc
+++ b/content/renderer/service_worker/service_worker_provider_context_unittest.cc
@@ -78,10 +78,10 @@
   // Implements blink::mojom::ServiceWorkerObjectHost.
   void PostMessageToServiceWorker(
       ::blink::TransferableMessage message) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   void TerminateForTesting(TerminateForTestingCallback callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   const int64_t version_id_;
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.cc b/content/renderer/service_worker/service_worker_subresource_loader.cc
index 14ab95d..5bc5b5bd 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader.cc
@@ -956,7 +956,7 @@
       case FetchResponseFrom::kNoResponseYet:
       case FetchResponseFrom::kSubresourceLoaderIsHandlingRedirect:
       case FetchResponseFrom::kAutoPreloadHandlingFallback:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
       case FetchResponseFrom::kServiceWorker:
         RecordTimingMetricsForFetchHandlerHandledCase();
diff --git a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
index ef82d4d..47f7352 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
@@ -61,14 +61,14 @@
   }
   void AsDataPipeGetter(
       mojo::PendingReceiver<network::mojom::DataPipeGetter>) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   void ReadRange(
       uint64_t offset,
       uint64_t length,
       mojo::ScopedDataPipeProducerHandle handle,
       mojo::PendingRemote<blink::mojom::BlobReaderClient> client) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   void ReadAll(
       mojo::ScopedDataPipeProducerHandle handle,
@@ -85,7 +85,7 @@
             const std::string& method,
             const net::HttpRequestHeaders&,
             mojo::PendingRemote<network::mojom::URLLoaderClient>) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   void ReadSideData(ReadSideDataCallback callback) override {
     std::move(callback).Run(side_data_);
@@ -94,7 +94,7 @@
     std::move(callback).Run(body_.size(), std::nullopt);
   }
   void GetInternalUUID(GetInternalUUIDCallback callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   mojo::ReceiverSet<blink::mojom::Blob> receivers_;
@@ -244,7 +244,7 @@
       // Copy the content to |out_string|.
       mojo::BlockingCopyToString(std::move(consumer_handle), out_string);
     } else {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
     }
   }
 
diff --git a/content/renderer/v8_value_converter_impl.cc b/content/renderer/v8_value_converter_impl.cc
index b8daae98..55ecbe6 100644
--- a/content/renderer/v8_value_converter_impl.cc
+++ b/content/renderer/v8_value_converter_impl.cc
@@ -518,7 +518,8 @@
     return std::make_unique<base::Value>(std::move(buffer));
   }
 
-  NOTREACHED() << "Only ArrayBuffer and ArrayBufferView should get here.";
+  NOTREACHED_IN_MIGRATION()
+      << "Only ArrayBuffer and ArrayBufferView should get here.";
   return nullptr;
 }
 
@@ -575,9 +576,10 @@
     // Extend this test to cover more types as necessary and if sensible.
     if (!key->IsString() &&
         !key->IsNumber()) {
-      NOTREACHED() << "Key \"" << *v8::String::Utf8Value(isolate, key)
-                   << "\" "
-                      "is neither a string nor a number";
+      NOTREACHED_IN_MIGRATION()
+          << "Key \"" << *v8::String::Utf8Value(isolate, key)
+          << "\" "
+             "is neither a string nor a number";
       continue;
     }
 
diff --git a/content/renderer/web_ui_extension.cc b/content/renderer/web_ui_extension.cc
index 2ee1a48..33b4091 100644
--- a/content/renderer/web_ui_extension.cc
+++ b/content/renderer/web_ui_extension.cc
@@ -155,7 +155,7 @@
     // so check that the frame is still valid to avoid dereferencing a stale
     // pointer.
     if (frame != blink::WebLocalFrame::FrameForCurrentContext()) {
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return;
     }
   }
diff --git a/content/services/auction_worklet/auction_v8_helper.cc b/content/services/auction_worklet/auction_v8_helper.cc
index 2d8c114..07c00b2 100644
--- a/content/services/auction_worklet/auction_v8_helper.cc
+++ b/content/services/auction_worklet/auction_v8_helper.cc
@@ -118,7 +118,7 @@
   ~TrivialSerializerDelegate() override = default;
 
   void ThrowDataCloneError(v8::Local<v8::String> message) override {
-    NOTREACHED();  // Should not have any weird types in our usage.
+    NOTREACHED_IN_MIGRATION();  // Should not have any weird types in our usage.
   }
 };
 
diff --git a/content/services/auction_worklet/webidl_compat.cc b/content/services/auction_worklet/webidl_compat.cc
index 0fc21c4a..6605f06 100644
--- a/content/services/auction_worklet/webidl_compat.cc
+++ b/content/services/auction_worklet/webidl_compat.cc
@@ -61,7 +61,7 @@
     v8::Isolate* isolate) const {
   switch (type()) {
     case Type::kSuccess:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return std::string();
     case Type::kTimeout:
       return absl::get<Timeout>(value_).timeout_message;
diff --git a/content/shell/browser/shell_file_select_helper.cc b/content/shell/browser/shell_file_select_helper.cc
index f3c54c3..af65337 100644
--- a/content/shell/browser/shell_file_select_helper.cc
+++ b/content/shell/browser/shell_file_select_helper.cc
@@ -143,7 +143,7 @@
     default:
       // Prevent warning.
       dialog_type_ = ui::SelectFileDialog::SELECT_OPEN_FILE;
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   gfx::NativeWindow owning_window = web_contents_->GetTopLevelNativeWindow();
diff --git a/content/shell/browser/shell_permission_manager.cc b/content/shell/browser/shell_permission_manager.cc
index 599fa311..e3bb410 100644
--- a/content/shell/browser/shell_permission_manager.cc
+++ b/content/shell/browser/shell_permission_manager.cc
@@ -77,7 +77,7 @@
       return false;
   }
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
diff --git a/content/shell/browser/shell_platform_delegate_ios.mm b/content/shell/browser/shell_platform_delegate_ios.mm
index c5a3324..753df95a 100644
--- a/content/shell/browser/shell_platform_delegate_ios.mm
+++ b/content/shell/browser/shell_platform_delegate_ios.mm
@@ -634,7 +634,7 @@
       break;
     }
     default:
-      NOTREACHED() << "Unknown UI control";
+      NOTREACHED_IN_MIGRATION() << "Unknown UI control";
       return;
   }
   [button setEnabled:is_enabled];
diff --git a/content/shell/browser/shell_platform_delegate_mac.mm b/content/shell/browser/shell_platform_delegate_mac.mm
index 93e8a437..a323674 100644
--- a/content/shell/browser/shell_platform_delegate_mac.mm
+++ b/content/shell/browser/shell_platform_delegate_mac.mm
@@ -267,7 +267,7 @@
       id = IDC_NAV_STOP;
       break;
     default:
-      NOTREACHED() << "Unknown UI control";
+      NOTREACHED_IN_MIGRATION() << "Unknown UI control";
       return;
   }
   [[shell_data.delegate.window.contentView viewWithTag:id]
diff --git a/content/shell/renderer/shell_content_renderer_client.cc b/content/shell/renderer/shell_content_renderer_client.cc
index e212343..a57df96 100644
--- a/content/shell/renderer/shell_content_renderer_client.cc
+++ b/content/shell/renderer/shell_content_renderer_client.cc
@@ -99,7 +99,7 @@
   }
 
   void DoTerminateProcess(DoTerminateProcessCallback callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void DoCrashImmediately(DoCrashImmediatelyCallback callback) override {
@@ -118,25 +118,25 @@
   void CreateReadOnlySharedMemoryRegion(
       const std::string& message,
       CreateReadOnlySharedMemoryRegionCallback callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void CreateWritableSharedMemoryRegion(
       const std::string& message,
       CreateWritableSharedMemoryRegionCallback callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void CreateUnsafeSharedMemoryRegion(
       const std::string& message,
       CreateUnsafeSharedMemoryRegionCallback callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void CloneSharedMemoryContents(
       base::ReadOnlySharedMemoryRegion region,
       CloneSharedMemoryContentsCallback callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void IsProcessSandboxed(IsProcessSandboxedCallback callback) override {
diff --git a/content/shell/utility/shell_content_utility_client.cc b/content/shell/utility/shell_content_utility_client.cc
index e4fc862..1cfcc6e 100644
--- a/content/shell/utility/shell_content_utility_client.cc
+++ b/content/shell/utility/shell_content_utility_client.cc
@@ -81,7 +81,7 @@
   }
 
   void GetRequestorName(GetRequestorNameCallback callback) override {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
 
   void CreateReadOnlySharedMemoryRegion(
@@ -151,7 +151,7 @@
     CHECK(region == base::MemoryMappedFile::Region::kWholeFile);
     CHECK(base::WriteFileDescriptor(write_pipe.get(), "test"));
 #else
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 #endif
   }
 
diff --git a/content/test/content_browser_test_utils_internal.cc b/content/test/content_browser_test_utils_internal.cc
index 6d6574a..0ea241dc 100644
--- a/content/test/content_browser_test_utils_internal.cc
+++ b/content/test/content_browser_test_utils_internal.cc
@@ -803,7 +803,7 @@
     const std::u16string& default_prompt_text,
     DialogClosedCallback callback,
     bool* did_suppress_message) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 void BeforeUnloadBlockingDelegate::RunBeforeUnloadDialog(
@@ -819,7 +819,7 @@
     WebContents* web_contents,
     bool accept,
     const std::u16string* prompt_override) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return true;
 }
 
@@ -1176,7 +1176,7 @@
   compositor->RequestSuccessfulPresentationTimeForNextFrame(
       std::move(callback));
 #else
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 #endif
   run_loop.Run();
 }
diff --git a/content/test/gpu/gpu_tests/test_expectations/expected_color_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/expected_color_expectations.txt
index fb9ce48..c995bf54 100644
--- a/content/test/gpu/gpu_tests/test_expectations/expected_color_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/expected_color_expectations.txt
@@ -126,10 +126,9 @@
 crbug.com/330132405 [ fuchsia fuchsia-board-qemu-x64 ] ExpectedColor_MediaRecorderFrom2DCanvas [ Failure ]
 
 # Gardener 2024-04-29 - page reported failure
-crbug.com/40877266 [ win angle-d3d11 graphite-enabled passthrough release ] ExpectedColor_MediaRecorderFromVideoElementWithOoprCanvasDisabled [ Failure ]
+crbug.com/40877266 [ amd-0x7340 angle-d3d11 graphite-enabled passthrough release-x64 win10 ] ExpectedColor_MediaRecorderFromVideoElementWithOoprCanvasDisabled [ Failure ]
+crbug.com/40877266 [ angle-d3d11 graphite-enabled intel-0x4680 passthrough release-x64 win10 ] ExpectedColor_MediaRecorderFromVideoElementWithOoprCanvasDisabled [ Failure ]
 
-# Gardener 2024-05-03 - Linux KVM causing incorrect screenshots
-crbug.com/338232679 [ linux angle-vulkan intel-0x4680 passthrough ] ExpectedColor_maps [ Failure ]
 
 #######################################################################
 # Automated Entries After This Point - Do Not Manually Add Below Here #
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index 77500c0..694ee7f 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
@@ -422,7 +422,7 @@
 # ========================
 
 # Failing new updated tests
-crbug.com/338008895 [ win angle-d3d11 nvidia-0x2184 passthrough release ] conformance2/rendering/framebuffer-render-to-layer.html [ Failure ]
+crbug.com/338008895 [ angle-d3d11 graphite-disabled nvidia-0x2184 nvidia_lt_31.0.15.4601 passthrough release win ] conformance2/rendering/framebuffer-render-to-layer.html [ Failure ]
 crbug.com/1131224 [ angle-d3d11 desktop no-asan oop-c passthrough release win10 ] conformance2/rendering/framebuffer-mismatched-attachment-targets.html [ Failure ]
 crbug.com/1108086 [ no-passthrough ] conformance2/renderbuffers/framebuffer-object-attachment.html [ Failure ]
 crbug.com/angleproject/4807 [ win angle-d3d11 passthrough ] conformance2/glsl3/switch-case.html [ Failure ]
diff --git a/content/test/mock_widget_input_handler.cc b/content/test/mock_widget_input_handler.cc
index 3e9ec72f..6fa89a7 100644
--- a/content/test/mock_widget_input_handler.cc
+++ b/content/test/mock_widget_input_handler.cc
@@ -114,7 +114,7 @@
 
 void MockWidgetInputHandler::WaitForInputProcessed(
     WaitForInputProcessedCallback callback) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 }
 
 MockWidgetInputHandler::MessageVector
diff --git a/content/test/test_navigation_url_loader_delegate.cc b/content/test/test_navigation_url_loader_delegate.cc
index cdca0d9..81e08a92 100644
--- a/content/test/test_navigation_url_loader_delegate.cc
+++ b/content/test/test_navigation_url_loader_delegate.cc
@@ -79,7 +79,7 @@
 std::optional<NavigationEarlyHintsManagerParams>
 TestNavigationURLLoaderDelegate::CreateNavigationEarlyHintsManagerParams(
     const network::mojom::EarlyHints& early_hints) {
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return std::nullopt;
 }
 
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc
index 62db83e..1b9c58b6 100644
--- a/content/test/test_render_frame.cc
+++ b/content/test/test_render_frame.cc
@@ -125,7 +125,8 @@
   // mojom::FrameHost:
   void CreateNewWindow(mojom::CreateNewWindowParamsPtr,
                        CreateNewWindowCallback) override {
-    NOTREACHED() << "We should never dispatch to the service side signature.";
+    NOTREACHED_IN_MIGRATION()
+        << "We should never dispatch to the service side signature.";
   }
 
   bool CreateNewWindow(mojom::CreateNewWindowParamsPtr params,
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc
index 4f5f910..51428bcd 100644
--- a/content/test/test_render_view_host.cc
+++ b/content/test/test_render_view_host.cc
@@ -106,7 +106,7 @@
 #if !BUILDFLAG(IS_IOS)
   return &text_input_client_;
 #else
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return nullptr;
 #endif
 }
diff --git a/content/web_test/browser/web_test_background_fetch_delegate.cc b/content/web_test/browser/web_test_background_fetch_delegate.cc
index 34becb0..e6e1fe4 100644
--- a/content/web_test/browser/web_test_background_fetch_delegate.cc
+++ b/content/web_test/browser/web_test_background_fetch_delegate.cc
@@ -151,7 +151,7 @@
         // The client cancelled or aborted it so no need to notify it.
         return;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return;
     }
 
diff --git a/content/web_test/browser/web_test_bluetooth_adapter_provider.cc b/content/web_test/browser/web_test_bluetooth_adapter_provider.cc
index f2adc3a..6966ba6 100644
--- a/content/web_test/browser/web_test_bluetooth_adapter_provider.cc
+++ b/content/web_test/browser/web_test_bluetooth_adapter_provider.cc
@@ -767,7 +767,7 @@
         .WillByDefault(
             Invoke([](const std::vector<uint8_t>&, base::OnceClosure&,
                       BluetoothRemoteGattDescriptor::ErrorCallback&) {
-              NOTREACHED();
+              NOTREACHED_IN_MIGRATION();
             }));
 
     auto no_read_descriptor = std::make_unique<NiceMockBluetoothGattDescriptor>(
@@ -783,7 +783,7 @@
     ON_CALL(*no_read_descriptor, ReadRemoteDescriptor_(_))
         .WillByDefault(
             Invoke([](BluetoothRemoteGattDescriptor::ValueCallback&) {
-              NOTREACHED();
+              NOTREACHED_IN_MIGRATION();
             }));
 
     // Add it here with full permission as the blocklist should prevent us from
@@ -1501,7 +1501,7 @@
   ON_CALL(*blocklist_exclude_reads_characteristic, ReadRemoteCharacteristic_(_))
       .WillByDefault(
           Invoke([](BluetoothRemoteGattCharacteristic::ValueCallback&) {
-            NOTREACHED();
+            NOTREACHED_IN_MIGRATION();
           }));
 
   // Write response.
@@ -1537,7 +1537,7 @@
   ON_CALL(*serial_number_string, ReadRemoteCharacteristic_(_))
       .WillByDefault(
           Invoke([](BluetoothRemoteGattCharacteristic::ValueCallback&) {
-            NOTREACHED();
+            NOTREACHED_IN_MIGRATION();
           }));
 
   device_information->AddMockCharacteristic(std::move(serial_number_string));
@@ -1602,7 +1602,7 @@
             [](const std::vector<uint8_t>&,
                BluetoothRemoteGattCharacteristic::WriteType, base::OnceClosure&,
                BluetoothRemoteGattCharacteristic::ErrorCallback&) {
-              NOTREACHED();
+              NOTREACHED_IN_MIGRATION();
             }));
 
     // Crash if WriteRemoteCharacteristic called. Not using GoogleMock's Expect
@@ -1613,7 +1613,7 @@
         .WillByDefault(
             Invoke([](const std::vector<uint8_t>&, base::OnceClosure&,
                       BluetoothRemoteGattCharacteristic::ErrorCallback&) {
-              NOTREACHED();
+              NOTREACHED_IN_MIGRATION();
             }));
 
     generic_access->AddMockCharacteristic(std::move(peripheral_privacy_flag));
diff --git a/content/web_test/browser/web_test_control_host.cc b/content/web_test/browser/web_test_control_host.cc
index edf10b82..b5a7dcf 100644
--- a/content/web_test/browser/web_test_control_host.cc
+++ b/content/web_test/browser/web_test_control_host.cc
@@ -1377,7 +1377,7 @@
   else if (renderer_dump_result_->layout)
     OnTextDump(*renderer_dump_result_->layout);
   else
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 
   // Use the browser-generated |pixel_dump_| if present, else use the
   // renderer's.
@@ -1427,7 +1427,7 @@
         pixel_format = gfx::PNGCodec::FORMAT_RGBA;
         break;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return;
     }
 
@@ -1534,7 +1534,7 @@
   } else if (name == "top-level-storage-access") {
     type = blink::PermissionType::TOP_LEVEL_STORAGE_ACCESS;
   } else {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     type = blink::PermissionType::NOTIFICATIONS;
   }
 
diff --git a/content/web_test/browser/web_test_devtools_bindings.cc b/content/web_test/browser/web_test_devtools_bindings.cc
index 2ff20b9..948f3fa 100644
--- a/content/web_test/browser/web_test_devtools_bindings.cc
+++ b/content/web_test/browser/web_test_devtools_bindings.cc
@@ -73,7 +73,7 @@
 
   base::FilePath dir_exe;
   if (!base::PathService::Get(base::DIR_EXE, &dir_exe)) {
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return GURL();
   }
 #if BUILDFLAG(IS_MAC)
diff --git a/content/web_test/browser/web_test_shell_platform_delegate_mac.mm b/content/web_test/browser/web_test_shell_platform_delegate_mac.mm
index f193f53..8367b2c 100644
--- a/content/web_test/browser/web_test_shell_platform_delegate_mac.mm
+++ b/content/web_test/browser/web_test_shell_platform_delegate_mac.mm
@@ -49,7 +49,7 @@
   if (!IsHeadless())
     return ShellPlatformDelegate::GetNativeWindow(shell);
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return {};
 }
 
diff --git a/content/web_test/browser/web_test_shell_platform_delegate_views.cc b/content/web_test/browser/web_test_shell_platform_delegate_views.cc
index f3a058ca..4337374 100644
--- a/content/web_test/browser/web_test_shell_platform_delegate_views.cc
+++ b/content/web_test/browser/web_test_shell_platform_delegate_views.cc
@@ -56,7 +56,7 @@
   if (!IsHeadless())
     return ShellPlatformDelegate::GetNativeWindow(shell);
 
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return {};
 }
 
diff --git a/content/web_test/renderer/event_sender.cc b/content/web_test/renderer/event_sender.cc
index 5500c71..a17ce4b 100644
--- a/content/web_test/renderer/event_sender.cc
+++ b/content/web_test/renderer/event_sender.cc
@@ -142,7 +142,7 @@
       return WebInputEvent::Type::kPointerMove;
     case WebTouchPoint::State::kStateStationary:
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return WebInputEvent::Type::kUndefined;
   }
 }
@@ -211,7 +211,7 @@
     case 4:
       return WebMouseEvent::Button::kForward;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return WebMouseEvent::Button::kNoButton;
 }
 
@@ -232,7 +232,7 @@
     case WebPointerProperties::Button::kEraser:
       return 0;  // Not implemented yet
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return 0;
 }
 
@@ -2391,7 +2391,7 @@
     case WebInputEvent::Type::kGestureFlingStart:
     case WebInputEvent::Type::kGestureFlingCancel:
       // Flings are no longer handled on the main thread.
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
       return;
     case WebInputEvent::Type::kGestureTap: {
       float tap_count = 1;
@@ -2517,7 +2517,7 @@
       }
       break;
     default:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
 
   event.unique_touch_event_id = GetUniqueTouchEventId(args);
@@ -2802,7 +2802,7 @@
         break;
       }
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
     }
   }
 
diff --git a/content/web_test/renderer/test_plugin.cc b/content/web_test/renderer/test_plugin.cc
index 500e2f0..06d20ffa 100644
--- a/content/web_test/renderer/test_plugin.cc
+++ b/content/web_test/renderer/test_plugin.cc
@@ -411,7 +411,7 @@
   else if (string == *kPrimitiveTriangle)
     primitive = PrimitiveTriangle;
   else
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   return primitive;
 }
 
@@ -429,7 +429,7 @@
   else if (string == "blue")
     color[2] = 255;
   else
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 }
 
 float TestPlugin::ParseOpacity(const blink::WebString& string) {
@@ -679,7 +679,7 @@
       drag_status_name = "DragDrop";
       break;
     case blink::kWebDragStatusUnknown:
-      NOTREACHED();
+      NOTREACHED_IN_MIGRATION();
   }
   test_runner_->PrintMessage(
       std::string("Plugin received event: ") + drag_status_name + "\n",
diff --git a/content/web_test/renderer/test_runner.cc b/content/web_test/renderer/test_runner.cc
index a4f5f0a3..8fbf5061 100644
--- a/content/web_test/renderer/test_runner.cc
+++ b/content/web_test/renderer/test_runner.cc
@@ -1119,7 +1119,7 @@
   else if (connection_type == "Type4G")
     web_type = blink::WebEffectiveConnectionType::kType4G;
   else
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
 
   if (runner_)
     runner_->SetEffectiveConnectionType(web_type);
@@ -2584,7 +2584,7 @@
       source.GetWebTestControlHostRemote()->Reload();
       return true;
   }
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -2906,7 +2906,7 @@
 
   return PrintFrameToBitmap(target_frame);
 #else
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return SkBitmap();
 #endif
 }
diff --git a/content/web_test/renderer/web_ax_object_proxy.cc b/content/web_test/renderer/web_ax_object_proxy.cc
index b1c92247..9663376 100644
--- a/content/web_test/renderer/web_ax_object_proxy.cc
+++ b/content/web_test/renderer/web_ax_object_proxy.cc
@@ -173,7 +173,7 @@
                          inline_text_box_rect.width(), character_offsets[0]);
       }
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return gfx::Rect();
     }
   }
diff --git a/content/web_test/renderer/web_frame_test_proxy.cc b/content/web_test/renderer/web_frame_test_proxy.cc
index b679cb81..eec6155 100644
--- a/content/web_test/renderer/web_frame_test_proxy.cc
+++ b/content/web_test/renderer/web_frame_test_proxy.cc
@@ -715,7 +715,8 @@
     case ax::mojom::Event::kWindowDeactivated:
     case ax::mojom::Event::kWindowVisibilityChanged:
       // Never fired from Blink.
-      NOTREACHED() << "Event not expected from Blink: " << event.event_type;
+      NOTREACHED_IN_MIGRATION()
+          << "Event not expected from Blink: " << event.event_type;
   }
 
   blink::WebDocument document = GetWebFrame()->GetDocument();
diff --git a/content/zygote/zygote_linux.cc b/content/zygote/zygote_linux.cc
index 9c48186..3b046c28 100644
--- a/content/zygote/zygote_linux.cc
+++ b/content/zygote/zygote_linux.cc
@@ -168,7 +168,7 @@
     }
   }
   // The loop should not be exited unless a request was successfully processed.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
   return false;
 }
 
@@ -276,13 +276,13 @@
         // HandleForkRequest (e.g., if ReadArgsAndFork fails during depickling)
         // could leave this command pending on the socket.
         LOG(ERROR) << "Unexpected real PID message from browser";
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         return false;
       case kZygoteCommandReinitializeLogging:
         HandleReinitializeLoggingRequest(iter, std::move(fds));
         return false;
       default:
-        NOTREACHED();
+        NOTREACHED_IN_MIGRATION();
         break;
     }
   }
@@ -302,7 +302,7 @@
   ZygoteProcessInfo child_info;
   if (!GetProcessInfo(child, &child_info)) {
     LOG(ERROR) << "Child not found!";
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return;
   }
   child_info.time_of_reap_request = base::TimeTicks::Now();
@@ -330,7 +330,7 @@
   ZygoteProcessInfo child_info;
   if (!GetProcessInfo(real_pid, &child_info)) {
     LOG(ERROR) << "Zygote::GetTerminationStatus for unknown PID " << real_pid;
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     return false;
   }
   // We know about |real_pid|.
@@ -385,7 +385,7 @@
   if (!got_termination_status) {
     // Assume that if we can't find the child in the sandbox, then
     // it terminated normally.
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
     status = base::TERMINATION_STATUS_NORMAL_TERMINATION;
     exit_code = RESULT_CODE_NORMAL_EXIT;
   }
@@ -542,7 +542,7 @@
   // Now set-up this process to be tracked by the Zygote.
   if (base::Contains(process_info_map_, real_pid)) {
     LOG(ERROR) << "Already tracking PID " << real_pid;
-    NOTREACHED();
+    NOTREACHED_IN_MIGRATION();
   }
   process_info_map_[real_pid].internal_pid = pid;
   process_info_map_[real_pid].started_from_helper = helper;
@@ -713,7 +713,7 @@
   }
 #else
   // This method should only be used in ChromeOS.
-  NOTREACHED();
+  NOTREACHED_IN_MIGRATION();
 #endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
diff --git a/docs/dangling_ptr.md b/docs/dangling_ptr.md
index 2ba262e9..7d5118f 100644
--- a/docs/dangling_ptr.md
+++ b/docs/dangling_ptr.md
@@ -51,7 +51,7 @@
 ```
 
 ```gn
-use_goma = true
+use_remoteexec = true
 is_debug = false  # Important! (*)
 is_component_build = false  # Important! (*)
 dcheck_always_on = true
diff --git a/docs/disassemble_code.md b/docs/disassemble_code.md
index 90c6e43e..203901c 100644
--- a/docs/disassemble_code.md
+++ b/docs/disassemble_code.md
@@ -47,7 +47,7 @@
 symbol_level = 1
 
 # Restricted options. May not make sense for non-Googlers.
-use_goma = true
+use_remoteexec = true
 proprietary_codecs = true
 ffmpeg_branding = "Chrome"
 ```
diff --git a/docs/fuchsia/build_instructions.md b/docs/fuchsia/build_instructions.md
index e6333a0..ad74f33 100644
--- a/docs/fuchsia/build_instructions.md
+++ b/docs/fuchsia/build_instructions.md
@@ -50,7 +50,7 @@
    $ gn gen out/fuchsia --args="is_debug=false dcheck_always_on=true is_component_build=false target_os=\"fuchsia\""
    ```
 
-   You can add many of the usual GN arguments like `use_goma = true`. In
+   You can add many of the usual GN arguments like `use_remoteexec = true`. In
    particular, when working with devices, consider using `is_debug = false` and
    `is_component_build = false` since debug and component builds can drastically
    increase run time and used space.
@@ -223,7 +223,7 @@
 You can also build for Debug, with `is_debug=true`, but since we don't currently
 have any Debug build-bots, it may be more broken than Release.
 
-`use_goma=true` is fine to use also if you're a Googler.
+`use_remoteexec=true` is fine to use also if you're a Googler.
 
 Architecture options are x64 (default) and arm64. This can be set with
 `target_cpu=\"arm64\"`.
diff --git a/docs/linux/ozone_drm.md b/docs/linux/ozone_drm.md
index 37e448a5..7f254a2 100644
--- a/docs/linux/ozone_drm.md
+++ b/docs/linux/ozone_drm.md
@@ -54,7 +54,7 @@
 use_system_minigbm = false
 target_sysroot = "//build/linux/debian_jessie_amd64-sysroot"
 is_debug = false
-use_goma = true
+use_remoteexec = true
 use_xkbcommon = true
 #use_evdev_gestures = true
 #use_system_libevdev = false
diff --git a/docs/speed/binary_size/fuchsia_binary_size_trybot.md b/docs/speed/binary_size/fuchsia_binary_size_trybot.md
index cb553fb..80b1250f1 100644
--- a/docs/speed/binary_size/fuchsia_binary_size_trybot.md
+++ b/docs/speed/binary_size/fuchsia_binary_size_trybot.md
@@ -175,7 +175,7 @@
 is_official_build = true
 target_cpu = "arm64"
 target_os = "fuchsia"
-use_goma = true  # If appropriate.
+use_remoteexec = true  # If appropriate.
 ```
 
 ### 2. Build
diff --git a/docs/updater/dev_manual.md b/docs/updater/dev_manual.md
index 61373a6..cea369b 100644
--- a/docs/updater/dev_manual.md
+++ b/docs/updater/dev_manual.md
@@ -274,14 +274,14 @@
 
 * macOS/Linux
 ```
-gn gen out/coverage --args="use_clang_coverage=true is_component_build=false is_chrome_branded=true is_debug=true use_debug_fission=true use_goma=true symbol_level=2"
+gn gen out/coverage --args="use_clang_coverage=true is_component_build=false is_chrome_branded=true is_debug=true use_debug_fission=true use_remoteexec=true symbol_level=2"
 
 vpython3 tools/code_coverage/coverage.py  updater_tests -b out/coverage -o out/report -c 'out/coverage/updater_tests' -f chrome/updater
 ```
 
 * Windows
 ```
-gn gen out\coverage --args="use_clang_coverage=true is_component_build=false is_chrome_branded=true is_debug=true use_debug_fission=true use_goma=true symbol_level=2"
+gn gen out\coverage --args="use_clang_coverage=true is_component_build=false is_chrome_branded=true is_debug=true use_debug_fission=true use_remoteexec=true symbol_level=2"
 
 vpython3 tools\code_coverage\coverage.py updater_tests -b out\coverage -o out\report -c out\coverage\updater_tests.exe  -f chrome/updater
 ```
diff --git a/docs/website b/docs/website
index 8e629b8..4c6c483 160000
--- a/docs/website
+++ b/docs/website
@@ -1 +1 @@
-Subproject commit 8e629b8e931092d4def0971841ede11bb3e34d17
+Subproject commit 4c6c48346cb13f8dd27939d376bc4f2a97b86b39
diff --git a/docs/workflow/debugging-with-swarming.md b/docs/workflow/debugging-with-swarming.md
index 491939b..c1ce34a540 100644
--- a/docs/workflow/debugging-with-swarming.md
+++ b/docs/workflow/debugging-with-swarming.md
@@ -127,7 +127,7 @@
 symbol_level = 1
 system_webview_package_name = "com.google.android.webview"
 target_os = "android"
-use_goma = true
+use_remoteexec = true
 ```
 
 ## Bot selection criteria
diff --git a/extensions/browser/api/web_request/extension_web_request_event_router.cc b/extensions/browser/api/web_request/extension_web_request_event_router.cc
index 43835c7..6826cd2 100644
--- a/extensions/browser/api/web_request/extension_web_request_event_router.cc
+++ b/extensions/browser/api/web_request/extension_web_request_event_router.cc
@@ -894,7 +894,7 @@
     }
   }
 
-  // Whether to initialized |blocked_requests_|.
+  // Whether to initialized `blocked_requests_`.
   bool initialize_blocked_requests = false;
 
   initialize_blocked_requests |= ProcessDeclarativeRules(
@@ -918,17 +918,12 @@
         browser_context, request, listeners, std::move(event_details));
   }
 
-  // Handle Declarative Net Request API rules. In case the request is blocked or
-  // redirected, we un-block the request and ignore any subsequent responses
-  // from webRequestBlocking listeners. Note: We don't remove the request from
-  // the |EventListener::blocked_requests| set of any blocking listeners it was
-  // dispatched to, since the listener's response will be ignored in
-  // |DecrementBlockCount| anyway.
-
-  // Only checking the rules in the OnBeforeRequest stage works, since the rules
-  // currently only depend on the request url, initiator and resource type,
-  // which should stay the same during the diffierent network request stages. A
-  // redirect should cause another OnBeforeRequest call.
+  // Handle Declarative Net Request API rules matched in this request phase.
+  // In case the request is blocked or redirected, we un-block the request and
+  // ignore any subsequent responses from webRequestBlocking listeners. Note: We
+  // don't remove the request from the `EventListener::blocked_requests` set of
+  // any blocking listeners it was dispatched to, since the listener's response
+  // will be ignored in `DecrementBlockCount` anyway.
   declarative_net_request::RulesetManager* ruleset_manager =
       declarative_net_request::RulesMonitorService::Get(browser_context)
           ->ruleset_manager();
@@ -954,9 +949,12 @@
       scoped_timer = base::ScopedClosureRunner(
           base::BindOnce(record_completion_time,
                          &GetExtensionWebRequestTimeTracker(), request->id));
-    }
 
-    for (const auto& action : actions) {
+      // Only the first action in `actions` need to be checked, as all action
+      // types except MODIFY_HEADERS expect only one action, and for
+      // MODIFY_HEADERS, a check is performed to make sure all `actions` are
+      // MODIFY_HEADERS.
+      const DNRRequestAction& action = actions[0];
       switch (action.type) {
         case DNRRequestAction::Type::BLOCK:
           ClearPendingCallbacks(browser_context, *request);
@@ -1160,9 +1158,14 @@
             *request, original_response_headers, is_incognito_context);
 
     // TODO(crbug.com/40727004): This shares a lot of logic with the equivalent
-    // loop in OnBeforeRequest. Refactor into a common method once all action
+    // block in OnBeforeRequest. Refactor into a common method once all action
     // types are supported.
-    for (const auto& action : actions) {
+    if (!actions.empty()) {
+      // Similar to OnBeforeRequest, only the first action needs to be examined.
+      // In the case of MODIFY_HEADERS, any operations needed to re-compute
+      // `request->dnr_actions` only needs to be executed once.
+      const DNRRequestAction& action = actions[0];
+
       switch (action.type) {
         case DNRRequestAction::Type::BLOCK:
           ClearPendingCallbacks(browser_context, *request);
@@ -1222,6 +1225,8 @@
           // to `request->dnr_actions` since said action(s) can be taken on the
           // request now. Modify header actions need to be saved since they will
           // take effect later.
+          // Note: Since `actions` will be moved here either way, `action` is
+          // unsafe to use after this point!
 
           // If no modify header actions were matched in previous request
           // stages, then `request->dnr_actions` can simply be overwritten by
diff --git a/internal b/internal
index e5e2a24..7dd880d 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit e5e2a244238ca2c121fe6289a9451272491d250d
+Subproject commit 7dd880d1117972980fe839be72f9165505873a49
diff --git a/ios/chrome/browser/sync/model/BUILD.gn b/ios/chrome/browser/sync/model/BUILD.gn
index ad18f9a7..9ae55efa 100644
--- a/ios/chrome/browser/sync/model/BUILD.gn
+++ b/ios/chrome/browser/sync/model/BUILD.gn
@@ -34,7 +34,6 @@
     "//components/invalidation/impl",
     "//components/keyed_service/core",
     "//components/keyed_service/ios",
-    "//components/metrics/demographics",
     "//components/network_time",
     "//components/password_manager/core/browser",
     "//components/password_manager/core/browser/sharing",
diff --git a/ios/chrome/browser/sync/model/ios_chrome_sync_client.h b/ios/chrome/browser/sync/model/ios_chrome_sync_client.h
index f6bedad..d7dba4a 100644
--- a/ios/chrome/browser/sync/model/ios_chrome_sync_client.h
+++ b/ios/chrome/browser/sync/model/ios_chrome_sync_client.h
@@ -64,7 +64,6 @@
   GetControllerDelegateForModelType(syncer::ModelType type) override;
   syncer::SyncApiComponentFactory* GetSyncApiComponentFactory() override;
   bool IsCustomPassphraseAllowed() override;
-  void OnLocalSyncTransportDataCleared() override;
   bool IsPasswordSyncAllowed() override;
   void SetPasswordSyncAllowedChangeCb(
       const base::RepeatingClosure& cb) override;
diff --git a/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm
index 9f89794..2d695cbf 100644
--- a/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm
+++ b/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm
@@ -22,7 +22,6 @@
 #import "components/dom_distiller/core/dom_distiller_service.h"
 #import "components/history/core/browser/history_service.h"
 #import "components/keyed_service/core/service_access_type.h"
-#import "components/metrics/demographics/user_demographics.h"
 #import "components/password_manager/core/browser/password_store/password_store_interface.h"
 #import "components/password_manager/core/browser/sharing/password_receiver_service.h"
 #import "components/password_manager/core/browser/sharing/password_sender_service.h"
@@ -293,11 +292,6 @@
   return true;
 }
 
-void IOSChromeSyncClient::OnLocalSyncTransportDataCleared() {
-  DCHECK_CURRENTLY_ON(web::WebThread::UI);
-  metrics::ClearDemographicsPrefs(browser_state_->GetPrefs());
-}
-
 bool IOSChromeSyncClient::IsPasswordSyncAllowed() {
   return true;
 }
diff --git a/ios/web_view/internal/sync/web_view_sync_client.h b/ios/web_view/internal/sync/web_view_sync_client.h
index f7eb2d5..9398a9f 100644
--- a/ios/web_view/internal/sync/web_view_sync_client.h
+++ b/ios/web_view/internal/sync/web_view_sync_client.h
@@ -63,7 +63,6 @@
   GetControllerDelegateForModelType(syncer::ModelType type) override;
   syncer::SyncApiComponentFactory* GetSyncApiComponentFactory() override;
   bool IsCustomPassphraseAllowed() override;
-  void OnLocalSyncTransportDataCleared() override;
   bool IsPasswordSyncAllowed() override;
   void SetPasswordSyncAllowedChangeCb(
       const base::RepeatingClosure& cb) override;
diff --git a/ios/web_view/internal/sync/web_view_sync_client.mm b/ios/web_view/internal/sync/web_view_sync_client.mm
index 46fbec0..ab8d4cb3 100644
--- a/ios/web_view/internal/sync/web_view_sync_client.mm
+++ b/ios/web_view/internal/sync/web_view_sync_client.mm
@@ -207,11 +207,6 @@
   return true;
 }
 
-void WebViewSyncClient::OnLocalSyncTransportDataCleared() {
-  DCHECK_CURRENTLY_ON(web::WebThread::UI);
-  metrics::ClearDemographicsPrefs(pref_service_);
-}
-
 bool WebViewSyncClient::IsPasswordSyncAllowed() {
   return true;
 }
diff --git a/media/base/encoder_status.h b/media/base/encoder_status.h
index 67c515e..003f544f 100644
--- a/media/base/encoder_status.h
+++ b/media/base/encoder_status.h
@@ -50,7 +50,11 @@
     kInvalidInputFrame = 16,
     // The given output buffer or its id  is invalid.
     kInvalidOutputBuffer = 17,
-    kMaxValue = kInvalidOutputBuffer,
+    // Failure in converting H264/HEVC AnnexB to H264/HEVC bitstream.
+    kBitstreamConversionError = 18,
+    // Failure in allocating a buffer.
+    kOutOfMemoryError = 19,
+    kMaxValue = kOutOfMemoryError,
   };
   static constexpr StatusGroupType Group() { return "EncoderStatus"; }
 };
diff --git a/media/video/av1_video_encoder.cc b/media/video/av1_video_encoder.cc
index c7416b0e..c197e669 100644
--- a/media/video/av1_video_encoder.cc
+++ b/media/video/av1_video_encoder.cc
@@ -130,7 +130,7 @@
 
     case AV1PROFILE_PROFILE_PRO:
       // We don't build libaom with high bit depth support.
-      return EncoderStatus(EncoderStatus::Codes::kEncoderUnsupportedConfig,
+      return EncoderStatus(EncoderStatus::Codes::kEncoderUnsupportedProfile,
                            "Professional profile is unsupported.");
 
     default:
@@ -423,7 +423,7 @@
 
   if (!frame) {
     std::move(done_cb).Run(
-        EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+        EncoderStatus(EncoderStatus::Codes::kInvalidInputFrame,
                       "No frame provided for encoding."));
     return;
   }
@@ -432,7 +432,7 @@
     frame = ConvertToMemoryMappedFrame(frame);
     if (!frame) {
       std::move(done_cb).Run(
-          EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+          EncoderStatus(EncoderStatus::Codes::kSystemAPICallError,
                         "Convert GMB frame to MemoryMappedFrame failed."));
       return;
     }
@@ -440,10 +440,9 @@
 
   if (!frame->IsMappable()) {
     std::move(done_cb).Run(
-        EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
-                      "Unexpected frame format.")
-            .WithData("IsMappable", frame->IsMappable())
-            .WithData("HasGpuMemoryBuffer", frame->HasGpuMemoryBuffer())
+        EncoderStatus(EncoderStatus::Codes::kInvalidInputFrame,
+                      "Frame is not mappable")
+            .WithData("storage type", frame->storage_type())
             .WithData("format", frame->format()));
     return;
   }
@@ -459,7 +458,7 @@
         options_.frame_size, frame->timestamp());
     if (!temp_frame) {
       std::move(done_cb).Run(
-          EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+          EncoderStatus(EncoderStatus::Codes::kOutOfMemoryError,
                         "Can't allocate a temporary frame for conversion"));
       return;
     }
@@ -467,9 +466,7 @@
     // If `frame->format()` is unsupported ConvertAndScale() will fail.
     auto convert_status = frame_converter_.ConvertAndScale(*frame, *temp_frame);
     if (!convert_status.is_ok()) {
-      std::move(done_cb).Run(
-          EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode)
-              .AddCause(std::move(convert_status)));
+      std::move(done_cb).Run(std::move(convert_status));
       return;
     }
 
diff --git a/media/video/openh264_video_encoder.cc b/media/video/openh264_video_encoder.cc
index ff40445d..f86795d 100644
--- a/media/video/openh264_video_encoder.cc
+++ b/media/video/openh264_video_encoder.cc
@@ -327,7 +327,7 @@
       conversion_buffer_, result.data, &config_changed, &converted_output_size);
 
   if (!status.is_ok())
-    return EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode)
+    return EncoderStatus(EncoderStatus::Codes::kBitstreamConversionError)
         .AddCause(std::move(status));
 
   result.size = converted_output_size;
@@ -337,7 +337,7 @@
     const auto& config = h264_converter_->GetCurrentConfig();
     desc = CodecDescription();
     if (!config.Serialize(desc.value())) {
-      return EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+      return EncoderStatus(EncoderStatus::Codes::kBitstreamConversionError,
                            "Failed to serialize AVC decoder config");
     }
   }
@@ -358,7 +358,7 @@
 
   if (!frame) {
     std::move(done_cb).Run(
-        EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+        EncoderStatus(EncoderStatus::Codes::kInvalidInputFrame,
                       "No frame provided for encoding."));
     return;
   }
@@ -371,9 +371,10 @@
   if ((!frame->IsMappable() && !frame->HasGpuMemoryBuffer()) ||
       !supported_format) {
     std::move(done_cb).Run(
-        EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+        EncoderStatus(EncoderStatus::Codes::kUnsupportedFrameFormat,
                       "Unexpected frame format.")
             .WithData("IsMappable", frame->IsMappable())
+            .WithData("storage type", frame->storage_type())
             .WithData("format", frame->format()));
     return;
   }
@@ -382,7 +383,7 @@
     frame = ConvertToMemoryMappedFrame(frame);
     if (!frame) {
       std::move(done_cb).Run(
-          EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+          EncoderStatus(EncoderStatus::Codes::kSystemAPICallError,
                         "Convert GMB frame to MemoryMappedFrame failed."));
       return;
     }
@@ -396,15 +397,13 @@
         options_.frame_size, frame->timestamp());
     if (!i420_frame) {
       std::move(done_cb).Run(
-          EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+          EncoderStatus(EncoderStatus::Codes::kOutOfMemoryError,
                         "Can't allocate an I420 frame."));
       return;
     }
     auto status = frame_converter_.ConvertAndScale(*frame, *i420_frame);
     if (!status.is_ok()) {
-      std::move(done_cb).Run(
-          EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode)
-              .AddCause(std::move(status)));
+      std::move(done_cb).Run(status);
       return;
     }
     frame = std::move(i420_frame);
diff --git a/media/video/video_encode_accelerator_adapter.cc b/media/video/video_encode_accelerator_adapter.cc
index 1c88833..7a70451 100644
--- a/media/video/video_encode_accelerator_adapter.cc
+++ b/media/video/video_encode_accelerator_adapter.cc
@@ -410,7 +410,7 @@
       gpu_factories_->GetVideoEncodeAcceleratorSupportedProfiles();
   if (!supported_profiles) {
     InitCompleted(
-        EncoderStatus(EncoderStatus::Codes::kEncoderInitializationError,
+        EncoderStatus(EncoderStatus::Codes::kEncoderUnsupportedProfile,
                       "No profile is supported by video encode accelerator."));
     return;
   }
@@ -426,9 +426,11 @@
 
   if (supported_rc_modes ==
       VideoEncodeAccelerator::SupportedRateControlMode::kNoMode) {
-    std::move(done_cb).Run(EncoderStatus(
-        EncoderStatus::Codes::kEncoderInitializationError,
-        "The profile is not supported by video encode accelerator."));
+    std::move(done_cb).Run(
+        EncoderStatus(
+            EncoderStatus::Codes::kEncoderUnsupportedProfile,
+            "The profile is not supported by video encode accelerator.")
+            .WithData("profile", profile));
     return;
   }
 
@@ -473,7 +475,7 @@
   const bool supported_format =
       format == PIXEL_FORMAT_NV12 || format == PIXEL_FORMAT_I420 || is_rgb;
   if (!supported_format) {
-    InitCompleted(EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+    InitCompleted(EncoderStatus(EncoderStatus::Codes::kUnsupportedFrameFormat,
                                 "Unexpected frame format.")
                       .WithData("frame", first_frame->AsHumanReadableString()));
     return;
@@ -542,8 +544,9 @@
 
   if (state_ != State::kReadyToEncode) {
     std::move(done_cb).Run(
-        EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
-                      "Encoder can't encode now."));
+        EncoderStatus(EncoderStatus::Codes::kEncoderIllegalState,
+                      "Encoder can't encode now.")
+            .WithData("state", static_cast<int32_t>(state_)));
     return;
   }
 
@@ -619,8 +622,12 @@
   if (options.bitrate && options_.bitrate &&
       options.bitrate->mode() != options_.bitrate->mode()) {
     std::move(done_cb).Run(
-        EncoderStatus(EncoderStatus::Codes::kEncoderInitializationError,
-                      "Bitrate mode change is not supported."));
+        EncoderStatus(EncoderStatus::Codes::kEncoderUnsupportedConfig,
+                      "Bitrate mode change is not supported.")
+            .WithData("current bitrate",
+                      static_cast<int32_t>(options_.bitrate->mode()))
+            .WithData("new bitrate",
+                      static_cast<int32_t>(options.bitrate->mode())));
     return;
   }
 
@@ -632,7 +639,7 @@
       new_frame_size = options.frame_size;
     } else {
       auto status =
-          EncoderStatus(EncoderStatus::Codes::kEncoderInitializationError,
+          EncoderStatus(EncoderStatus::Codes::kEncoderUnsupportedConfig,
                         "Resolution change is not supported.");
       std::move(done_cb).Run(status);
       return;
@@ -746,10 +753,10 @@
     auto handle = output_pool_->MaybeAllocateBuffer(output_buffer_size);
     if (!handle) {
       if (state_ == State::kInitializing) {
-        InitCompleted(EncoderStatus::Codes::kEncoderInitializationError);
+        InitCompleted(EncoderStatus::Codes::kOutOfMemoryError);
       } else if (reconfigure_cb_) {
         std::move(reconfigure_cb_)
-            .Run({EncoderStatus::Codes::kInvalidOutputBuffer,
+            .Run({EncoderStatus::Codes::kOutOfMemoryError,
                   "Failed to allocate buffer"});
         state_ = State::kNotInitialized;
       }
@@ -835,8 +842,10 @@
       }
 
       if (!status.is_ok()) {
-        NotifyErrorStatus({EncoderStatus::Codes::kEncoderFailedEncode,
-                           "Failed to convert a buffer to h264 chunk"});
+        NotifyErrorStatus(
+            EncoderStatus(EncoderStatus::Codes::kBitstreamConversionError,
+                          "Failed to convert a buffer to h264 chunk")
+                .AddCause(std::move(status)));
         return;
       }
       result.size = actual_output_size;
@@ -847,8 +856,9 @@
         const auto& config = h264_converter_->GetCurrentConfig();
         desc = CodecDescription();
         if (!config.Serialize(desc.value())) {
-          NotifyErrorStatus({media::EncoderStatus::Codes::kEncoderFailedEncode,
-                             "Failed to get h264 config"});
+          NotifyErrorStatus(
+              {media::EncoderStatus::Codes::kBitstreamConversionError,
+               "Failed to get h264 config"});
           return;
         }
       }
@@ -868,8 +878,10 @@
         }
 
         if (!status.is_ok()) {
-          NotifyErrorStatus({EncoderStatus::Codes::kEncoderFailedEncode,
-                             "Failed to convert a buffer to h265 chunk"});
+          NotifyErrorStatus(
+              EncoderStatus(EncoderStatus::Codes::kBitstreamConversionError,
+                            "Failed to convert a buffer to h265 chunk")
+                  .AddCause(std::move(status)));
           return;
         }
         result.size = actual_output_size;
@@ -881,7 +893,7 @@
           desc = CodecDescription();
           if (!config.Serialize(desc.value())) {
             NotifyErrorStatus(
-                {media::EncoderStatus::Codes::kEncoderFailedEncode,
+                {media::EncoderStatus::Codes::kBitstreamConversionError,
                  "Failed to get h265 config"});
             return;
           }
@@ -930,21 +942,13 @@
       << "VEA adapter error. Code: " << static_cast<int32_t>(status.code())
       << ". Message: " << status.message();
   if (state_ == State::kInitializing) {
-    InitCompleted(
-        EncoderStatus(EncoderStatus::Codes::kEncoderInitializationError,
-                      "VideoEncodeAccelerator encountered an error")
-            .WithData("VideoEncodeAccelerator status code",
-                      static_cast<int32_t>(status.code())));
+    InitCompleted(status);
     return;
   }
 
   if (state_ == State::kReconfiguring) {
     if (reconfigure_cb_) {
-      std::move(reconfigure_cb_)
-          .Run(EncoderStatus(EncoderStatus::Codes::kEncoderInitializationError,
-                             "VideoEncodeAccelerator encountered an error")
-                   .WithData("VideoEncodeAccelerator status code",
-                             static_cast<int32_t>(status.code())));
+      std::move(reconfigure_cb_).Run(status);
     }
     state_ = State::kNotInitialized;
     return;
@@ -955,11 +959,7 @@
 
   // Report the error to all encoding-done callbacks
   for (auto& encode : active_encodes_) {
-    std::move(encode->done_callback)
-        .Run(EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
-                           "VideoEncodeAccelerator encountered an error")
-                 .WithData("VideoEncodeAccelerator status code",
-                           static_cast<int32_t>(status.code())));
+    std::move(encode->done_callback).Run(status);
   }
   active_encodes_.clear();
   state_ = State::kNotInitialized;
@@ -1065,7 +1065,7 @@
   std::unique_ptr<ReadOnlyRegionPool::Handle> handle =
       input_pool_->MaybeAllocateBuffer();
   if (!handle || !handle->IsValid())
-    return EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode);
+    return EncoderStatus(EncoderStatus::Codes::kOutOfMemoryError);
 
   const base::WritableSharedMemoryMapping* mapping = handle->mapping();
   auto mapped_src_frame = src_frame->HasGpuMemoryBuffer()
@@ -1077,13 +1077,12 @@
       mapping->size(), src_frame->timestamp());
 
   if (!shared_frame || !mapped_src_frame)
-    return EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode);
+    return EncoderStatus(EncoderStatus::Codes::kSystemAPICallError);
 
   auto status =
       frame_converter_.ConvertAndScale(*mapped_src_frame, *shared_frame);
   if (!status.is_ok()) {
-    return EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode)
-        .AddCause(std::move(status));
+    return status;
   }
 
   shared_frame->BackWithSharedMemory(handle->region());
@@ -1119,7 +1118,7 @@
   auto gpu_frame =
       gmb_frame_pool_->MaybeCreateVideoFrame(dest_visible_rect.size());
   if (!gpu_frame)
-    return EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode);
+    return EncoderStatus(EncoderStatus::Codes::kOutOfMemoryError);
 
   gpu_frame->set_timestamp(src_frame->timestamp());
   gpu_frame->metadata().MergeMetadataFrom(src_frame->metadata());
@@ -1136,13 +1135,12 @@
                               ? ConvertToMemoryMappedFrame(src_frame)
                               : src_frame;
   if (!mapped_gpu_frame || !mapped_src_frame)
-    return EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode);
+    return EncoderStatus(EncoderStatus::Codes::kSystemAPICallError);
 
   auto status =
       frame_converter_.ConvertAndScale(*mapped_src_frame, *mapped_gpu_frame);
   if (!status.is_ok()) {
-    return EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode)
-        .AddCause(std::move(status));
+    return status;
   }
 
   // |mapped_gpu_frame| has the color space respecting the color conversion in
diff --git a/media/video/video_encode_accelerator_adapter_test.cc b/media/video/video_encode_accelerator_adapter_test.cc
index 94c37bb..fa49619 100644
--- a/media/video/video_encode_accelerator_adapter_test.cc
+++ b/media/video/video_encode_accelerator_adapter_test.cc
@@ -408,7 +408,7 @@
   adapter()->Initialize(
       VIDEO_CODEC_PROFILE_UNKNOWN, options, /*info_cb=*/base::DoNothing(),
       std::move(output_cb), base::BindLambdaForTesting([](EncoderStatus s) {
-        EXPECT_EQ(s.code(), EncoderStatus::Codes::kEncoderInitializationError);
+        EXPECT_EQ(s.code(), EncoderStatus::Codes::kEncoderUnsupportedProfile);
       }));
 
   auto frame =
diff --git a/media/video/vpx_video_encoder.cc b/media/video/vpx_video_encoder.cc
index 74045177..6ee53f7 100644
--- a/media/video/vpx_video_encoder.cc
+++ b/media/video/vpx_video_encoder.cc
@@ -10,6 +10,7 @@
 
 #include "base/containers/heap_array.h"
 #include "base/logging.h"
+#include "base/notreached.h"
 #include "base/numerics/checked_math.h"
 #include "base/strings/stringprintf.h"
 #include "base/time/time.h"
@@ -271,9 +272,8 @@
       }
       break;
     default:
-      NOTREACHED_IN_MIGRATION();  // Checked during Initialize().
+      NOTREACHED_NORETURN();  // Checked during Initialize().
   }
-
   return std::nullopt;
 }
 
@@ -415,7 +415,7 @@
       codec_config_.g_input_bit_depth = 10;
       break;
     default:
-      NOTREACHED_IN_MIGRATION();  // Enforced via a profile check above.
+      NOTREACHED_NORETURN();  // Enforced via a profile check above.
   }
 
   auto status = SetUpVpxConfig(options, profile_, &codec_config_);
@@ -543,7 +543,7 @@
   bool key_frame = encode_options.key_frame;
   if (!frame) {
     std::move(done_cb).Run(
-        EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+        EncoderStatus(EncoderStatus::Codes::kInvalidInputFrame,
                       "No frame provided for encoding."));
     return;
   }
@@ -552,7 +552,7 @@
     frame = ConvertToMemoryMappedFrame(frame);
     if (!frame) {
       std::move(done_cb).Run(
-          EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+          EncoderStatus(EncoderStatus::Codes::kSystemAPICallError,
                         "Convert GMB frame to MemoryMappedFrame failed."));
       return;
     }
@@ -560,9 +560,9 @@
 
   if (!frame->IsMappable()) {
     std::move(done_cb).Run(
-        EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
-                      "Unexpected frame format.")
-            .WithData("IsMappable", frame->IsMappable())
+        EncoderStatus(EncoderStatus::Codes::kInvalidInputFrame,
+                      "Frame is not mappable")
+            .WithData("storage type", frame->storage_type())
             .WithData("format", frame->format()));
     return;
   }
@@ -578,7 +578,7 @@
         options_.frame_size, frame->timestamp());
     if (!temp_frame) {
       std::move(done_cb).Run(
-          EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
+          EncoderStatus(EncoderStatus::Codes::kOutOfMemoryError,
                         "Can't allocate a temporary frame for conversion"));
       return;
     }
@@ -586,9 +586,7 @@
     // If `frame->format()` is unsupported ConvertAndScale() will fail.
     auto convert_status = frame_converter_.ConvertAndScale(*frame, *temp_frame);
     if (!convert_status.is_ok()) {
-      std::move(done_cb).Run(
-          EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode)
-              .AddCause(std::move(convert_status)));
+      std::move(done_cb).Run(std::move(convert_status));
       return;
     }
 
@@ -665,7 +663,7 @@
       break;
 
     default:
-      NOTREACHED_IN_MIGRATION();  // Checked during Initialize().
+      NOTREACHED_NORETURN();  // Checked during Initialize().
   }
 
   // Use zero as a timestamp, so encoder will not use it for rate control.
diff --git a/net/quic/quic_http_utils.cc b/net/quic/quic_http_utils.cc
index 706a1c38..740028cd 100644
--- a/net/quic/quic_http_utils.cc
+++ b/net/quic/quic_http_utils.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/metrics/histogram_macros.h"
+#include "base/strings/string_number_conversions.h"
 #include "net/spdy/spdy_log_util.h"
 
 namespace net {
@@ -41,22 +42,15 @@
     case quic::QuicPriorityType::kWebTransport: {
       auto web_transport_priority = priority.web_transport();
       dict.Set("quic_priority_type", "web_transport");
-      const char* stream_type = "invalid";
-      switch (web_transport_priority.stream_type) {
-        case quic::WebTransportStreamPriority::StreamType::kData:
-          stream_type = "data";
-          break;
-        case quic::WebTransportStreamPriority::StreamType::kHttp:
-          stream_type = "http";
-          break;
-        case quic::WebTransportStreamPriority::StreamType::kStatic:
-          stream_type = "static";
-          break;
-      }
-      dict.Set("web_transport_stream_type", stream_type);
-      // send_order is an int64_t, but base::Value doesn't support that type.
+      dict.Set("web_transport_session_id",
+               static_cast<int>(web_transport_priority.session_id));
+
+      // `send_group_number` is an uint64_t, `send_order` is an int64_t. But
+      // base::Value doesn't support these types.
       // Case to a double instead. As this is just for diagnostics, some loss of
       // precision is acceptable.
+      dict.Set("web_transport_send_group_number",
+               static_cast<double>(web_transport_priority.send_group_number));
       dict.Set("web_transport_send_order",
                static_cast<double>(web_transport_priority.send_order));
       break;
diff --git a/net/third_party/quiche/src b/net/third_party/quiche/src
index d3bc5ff..64cdc52a 160000
--- a/net/third_party/quiche/src
+++ b/net/third_party/quiche/src
@@ -1 +1 @@
-Subproject commit d3bc5ffc929b0895ae9e16774069a04ae6fe3c58
+Subproject commit 64cdc52a285d82dfd8756e0e30d15c2d08df6081
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 61fd22cc..475c76e 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -10862,6 +10862,12 @@
                     "enable_features": [
                         "KeyboardFocusableScrollers"
                     ]
+                },
+                {
+                    "name": "Disabled",
+                    "disable_features": [
+                        "KeyboardFocusableScrollers"
+                    ]
                 }
             ]
         }
diff --git a/third_party/blink/common/switches.cc b/third_party/blink/common/switches.cc
index e4e9dde..294c7a9 100644
--- a/third_party/blink/common/switches.cc
+++ b/third_party/blink/common/switches.cc
@@ -121,6 +121,14 @@
 extern const char kIntensiveWakeUpThrottlingPolicy_ForceDisable[] = "0";
 extern const char kIntensiveWakeUpThrottlingPolicy_ForceEnable[] = "1";
 
+// Used to communicate managed policy for KeyboardFocusableScrollers feature.
+// This feature is typically controlled by a RuntimeEnabledFeature, but requires
+// an enterprise policy override.
+extern const char kKeyboardFocusableScrollersEnabled[] =
+    "keyboard-focusable-scrollers-enabled";
+extern const char kKeyboardFocusableScrollersOptOut[] =
+    "keyboard-focusable-scrollers-opt-out";
+
 // A command line to indicate if there ia any legacy tech report urls being set.
 // If so, we will send report from blink to browser process.
 extern const char kLegacyTechReportPolicyEnabled[] =
diff --git a/third_party/blink/public/common/switches.h b/third_party/blink/public/common/switches.h
index 9f819546..af705bd 100644
--- a/third_party/blink/public/common/switches.h
+++ b/third_party/blink/public/common/switches.h
@@ -50,6 +50,8 @@
 BLINK_COMMON_EXPORT extern const char
     kIntensiveWakeUpThrottlingPolicy_ForceEnable[];
 BLINK_COMMON_EXPORT extern const char kIntensiveWakeUpThrottlingPolicy[];
+BLINK_COMMON_EXPORT extern const char kKeyboardFocusableScrollersEnabled[];
+BLINK_COMMON_EXPORT extern const char kKeyboardFocusableScrollersOptOut[];
 BLINK_COMMON_EXPORT extern const char kLegacyTechReportPolicyEnabled[];
 BLINK_COMMON_EXPORT extern const char kJavaScriptFlags[];
 BLINK_COMMON_EXPORT extern const char kMaxUntiledLayerHeight[];
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5
index 51fde456..db672b67 100644
--- a/third_party/blink/renderer/core/css/css_properties.json5
+++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -316,9 +316,12 @@
         "background",
         "background-color",
         "blend-mode",
+        "border-image",
         "border-radius",
+        "border-width",
         "clip-path",
         "color",
+        "compositing",
         "filter-data",
         "inset",
         "layout",
@@ -328,11 +331,13 @@
         "opacity",
         "outline",
         "out-of-flow",
+        "paint",
         "reshape",
         "scroll-anchor",
         "table",
         "text-decoration",
         "transform-property",
+        "visual-overflow",
         "z-index",
       ],
     },
@@ -1645,7 +1650,6 @@
       default_value: "fixed",
       typedom_types: ["Keyword"],
       invalidate: ["layout"],
-      runtime_flag: "CssFieldSizing",
     },
     {
       name: "-webkit-locale",
@@ -1683,6 +1687,7 @@
       priority: 1,
       computable: false,
       valid_for_formatted_text: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-text-orientation",
@@ -1708,6 +1713,7 @@
       // Incremental code does not call DidChangeWritingMode(), which influences
       // the font.
       supports_incremental_style: false,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-writing-mode",
@@ -1790,6 +1796,7 @@
                  "after-edge", "text-after-edge", "hanging"],
       typedom_types: ["Keyword"],
       default_value: "auto",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "align-self",
@@ -1849,6 +1856,7 @@
       style_builder_custom_functions: ["value"],
       keywords: ["none"],
       typedom_types: ["Keyword"],
+      invalidate: ["compositing"],
     },
     {
       name: "backface-visibility",
@@ -1858,6 +1866,7 @@
       keywords: ["visible", "hidden"],
       typedom_types: ["Keyword"],
       default_value: "visible",
+      invalidate: ["compositing"],
     },
     {
       name: "background-attachment",
@@ -2054,6 +2063,7 @@
       style_builder_custom_functions: ["inherit", "value"],
       keywords: ["baseline", "sub", "super"],
       typedom_types: ["Keyword", "Percentage", "Length"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "baseline-source",
@@ -2153,6 +2163,7 @@
       },
       valid_for_permission_element: true,
       valid_for_page_context: true,
+      invalidate: ["border-width"],
     },
     {
       name: "border-bottom-width",
@@ -2176,6 +2187,7 @@
       overlapping: true,
       valid_for_permission_element: true,
       valid_for_page_context: true,
+      invalidate: ["border-width"],
     },
     {
       name: "border-collapse",
@@ -2301,6 +2313,7 @@
       },
       valid_for_permission_element: true,
       valid_for_page_context: true,
+      invalidate: ["border-width"],
     },
     {
       name: "border-left-width",
@@ -2324,6 +2337,7 @@
       overlapping: true,
       valid_for_permission_element: true,
       valid_for_page_context: true,
+      invalidate: ["border-width"],
     },
     {
       name: "border-right-color",
@@ -2369,6 +2383,7 @@
       },
       valid_for_permission_element: true,
       valid_for_page_context: true,
+      invalidate: ["border-width"],
     },
     {
       name: "border-right-width",
@@ -2392,6 +2407,7 @@
       overlapping: true,
       valid_for_permission_element: true,
       valid_for_page_context: true,
+      invalidate: ["border-width"],
     },
     {
       name: "border-top-color",
@@ -2482,6 +2498,7 @@
       supports_incremental_style: true,
       valid_for_permission_element: true,
       valid_for_page_context: true,
+      invalidate: ["border-width"],
     },
     {
       name: "border-top-width",
@@ -2505,6 +2522,7 @@
       overlapping: true,
       valid_for_permission_element: true,
       valid_for_page_context: true,
+      invalidate: ["border-width"],
     },
     {
       name: "bottom",
@@ -2542,6 +2560,7 @@
       typedom_types: ["Keyword"],
       valid_for_first_letter: true,
       valid_for_first_line: true,
+      invalidate: ["paint", "visual-overflow"],
     },
     {
       name: "box-sizing",
@@ -2642,6 +2661,7 @@
       typedom_types: ["Keyword"],
       default_value: "none",
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "clip",
@@ -2688,6 +2708,7 @@
       keywords: ["nonzero", "evenodd"],
       default_value: "RULE_NONZERO",
       typedom_types: ["Keyword"],
+      invalidate: ["paint"],
     },
     {
       name: "color-interpolation",
@@ -2699,6 +2720,7 @@
       keywords: ["auto", "srgb", "linearrgb"],
       default_value: "srgb",
       typedom_types: ["Keyword"],
+      invalidate: ["paint"],
     },
     {
       name: "color-interpolation-filters",
@@ -2710,6 +2732,7 @@
       keywords: ["auto", "srgb", "linearrgb"],
       default_value: "linearrgb",
       typedom_types: ["Keyword"],
+      invalidate: ["paint"],
     },
     {
       name: "color-rendering",
@@ -2748,6 +2771,7 @@
       getter: "GetColumnFill",
       typedom_types: ["Keyword"],
       computable: false,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "contain",
@@ -2903,6 +2927,7 @@
       typedom_types: ["Length", "Percentage"],
       converter: "ConvertLength",
       supports_incremental_style: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "cy",
@@ -2914,6 +2939,7 @@
       typedom_types: ["Length", "Percentage"],
       converter: "ConvertLength",
       supports_incremental_style: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "d",
@@ -2929,6 +2955,7 @@
       keywords: ["none"],
       typedom_types: ["Keyword"],
       supports_incremental_style: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "display",
@@ -2948,6 +2975,7 @@
       // so we turn off incremental style for all them all.
       supports_incremental_style: false,
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "dominant-baseline",
@@ -2959,6 +2987,7 @@
                  "use-script", "no-change", "reset-size", "text-after-edge", "text-before-edge"],
       default_value: "auto",
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "empty-cells",
@@ -2989,6 +3018,7 @@
       },
       valid_for_highlight_legacy: true,
       valid_for_highlight: true,
+      invalidate: ["paint"],
     },
     {
       name: "fill-opacity",
@@ -3002,6 +3032,7 @@
       converter: "ConvertAlpha",
       typedom_types: ["Number"],
       accepts_numeric_literal: true,
+      invalidate: ["paint"],
     },
     {
       name: "fill-rule",
@@ -3016,6 +3047,7 @@
       keywords: ["nonzero", "evenodd"],
       default_value: "RULE_NONZERO",
       typedom_types: ["Keyword"],
+      invalidate: ["paint"],
     },
     {
       name: "filter",
@@ -3044,6 +3076,7 @@
       typedom_types: ["Keyword", "Length", "Percentage"],
       keywords: ["auto", "fit-content", "min-content", "max-content", "content"],
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "flex-direction",
@@ -3054,6 +3087,7 @@
       keywords: ["row", "row-reverse", "column", "column-reverse"],
       default_value: "row",
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "flex-grow",
@@ -3065,6 +3099,7 @@
       type_name: "float",
       typedom_types: ["Number"],
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "flex-shrink",
@@ -3076,6 +3111,7 @@
       type_name: "float",
       typedom_types: ["Number"],
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "flex-wrap",
@@ -3086,6 +3122,7 @@
       keywords: ["nowrap", "wrap", "wrap-reverse"],
       default_value: "nowrap",
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "float",
@@ -3101,6 +3138,7 @@
       // See comment on display.
       supports_incremental_style: false,
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "flood-color",
@@ -3119,6 +3157,7 @@
       keywords: ["currentcolor"],
       typedom_types: ["Keyword"],
       supports_incremental_style: true,
+      invalidate: ["paint"],
     },
     {
       name: "flood-opacity",
@@ -3132,6 +3171,7 @@
       typedom_types: ["Number"],
       supports_incremental_style: true,
       accepts_numeric_literal: true,
+      invalidate: ["paint"],
     },
     {
       name: "grid-auto-columns",
@@ -3145,6 +3185,7 @@
       keywords: ["auto", "min-content", "max-content"],
       typedom_types: ["Keyword", "Length", "Percentage", "Flex"],
       separator: " ",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "grid-auto-flow",
@@ -3158,6 +3199,7 @@
       converter: "ConvertGridAutoFlow",
       keywords: ["row", "column"],
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "grid-auto-rows",
@@ -3171,6 +3213,7 @@
       keywords: ["auto", "min-content", "max-content"],
       typedom_types: ["Keyword", "Length", "Percentage", "Flex"],
       separator: " ",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "grid-column-end",
@@ -3183,6 +3226,7 @@
       keywords: ["auto"],
       typedom_types: ["Keyword"],
       converter: "ConvertGridPosition",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "grid-column-start",
@@ -3195,6 +3239,7 @@
       keywords: ["auto"],
       typedom_types: ["Keyword"],
       converter: "ConvertGridPosition",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "grid-row-end",
@@ -3207,6 +3252,7 @@
       keywords: ["auto"],
       typedom_types: ["Keyword"],
       converter: "ConvertGridPosition",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "grid-row-start",
@@ -3219,6 +3265,7 @@
       keywords: ["auto"],
       typedom_types: ["Keyword"],
       converter: "ConvertGridPosition",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "grid-template-areas",
@@ -3232,6 +3279,7 @@
       keywords: ["none"],
       typedom_types: ["Keyword"],
       converter: "ConvertGridTemplateAreas",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "grid-template-columns",
@@ -3249,6 +3297,7 @@
       },
       keywords: ["none"],
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "grid-template-rows",
@@ -3266,6 +3315,7 @@
       },
       keywords: ["none"],
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "height",
@@ -3301,6 +3351,7 @@
       default_value: "StyleHyphenateLimitChars()",
       include_paths: ["third_party/blink/renderer/core/style/style_hyphenate_limit_chars.h"],
       converter: "ConvertHyphenateLimitChars",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "popover-show-delay",
@@ -3339,6 +3390,7 @@
       type_name: "Hyphens",
       typedom_types: ["Keyword"],
       valid_for_marker: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "image-rendering",
@@ -3352,6 +3404,7 @@
       ],
       typedom_types: ["Keyword"],
       default_value: "auto",
+      invalidate: ["paint"],
     },
     {
       name: "image-orientation",
@@ -3366,6 +3419,7 @@
       include_paths: [
         "third_party/blink/renderer/platform/graphics/image_orientation.h"
       ],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "dynamic-range-limit",
@@ -3381,6 +3435,7 @@
       typedom_types: ["Keyword"],
       include_paths: ["third_party/blink/renderer/platform/graphics/graphics_types.h"],
       default_value: "DynamicRangeLimit(cc::PaintFlags::DynamicRangeLimit::kHigh)",
+      invalidate: ["paint"],
     },
     {
       name: "initial-letter",
@@ -3394,6 +3449,7 @@
       property_methods: ["ParseSingleValueFromRange", "CSSValueFromComputedStyleInternal"],
       type_name: "StyleInitialLetter",
       valid_for_first_letter: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "isolation",
@@ -3404,6 +3460,7 @@
       typedom_types: ["Keyword"],
       default_value: "auto",
       valid_for_permission_element: true,
+      invalidate: ["paint"],
     },
     {
       name: "justify-content",
@@ -3491,6 +3548,7 @@
       converter: "ConvertStyleColor",
       keywords: ["currentcolor"],
       typedom_types: ["Keyword"],
+      invalidate: ["paint"],
     },
     {
       name: "line-height",
@@ -3511,6 +3569,7 @@
       valid_for_marker: true,
       valid_for_page_context: true,
       affected_by_zoom: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "list-style-image",
@@ -3526,6 +3585,7 @@
       type_name: "StyleImage",
       style_builder_custom_functions: ["value"],
       keywords: ["none"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "list-style-position",
@@ -3666,6 +3726,7 @@
       converter: "ConvertElementReference",
       keywords: ["none"],
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "marker-mid",
@@ -3681,6 +3742,7 @@
       converter: "ConvertElementReference",
       keywords: ["none"],
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "marker-start",
@@ -3696,6 +3758,7 @@
       converter: "ConvertElementReference",
       keywords: ["none"],
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "mask-type",
@@ -3705,6 +3768,7 @@
       keywords: ["luminance", "alpha"],
       typedom_types: ["Keyword"],
       default_value: "luminance",
+      invalidate: ["paint"],
     },
     {
       name: "math-shift",
@@ -3823,7 +3887,7 @@
       default_value: "normal",
       name_for_methods: "BlendMode",
       type_name: "BlendMode",
-      invalidate: ["blend-mode"],
+      invalidate: ["blend-mode", "paint"],
     },
     {
       name: "object-fit",
@@ -3834,6 +3898,7 @@
       typedom_types: ["Keyword"],
       default_value: "fill",
       getter: "GetObjectFit",
+      invalidate: ["paint"],
     },
     {
       name: "object-position",
@@ -3846,6 +3911,7 @@
       type_name: "LengthPoint",
       converter: "ConvertPosition",
       typedom_types: ["Keyword", "Position"],
+      invalidate: ["paint"],
     },
     {
       name: "object-view-box",
@@ -3860,6 +3926,7 @@
       converter: "ConvertObjectViewBox",
       keywords: ["none"],
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "offset-anchor",
@@ -3952,6 +4019,7 @@
       type_name: "int",
       typedom_types: ["Number"],
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       // This property is used for testing with origin trial intergration only.
@@ -4071,6 +4139,7 @@
       default_value: "normal",
       typedom_types: ["Keyword"],
       valid_for_marker: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "overflow-inline",
@@ -4142,6 +4211,7 @@
       // Modifying overflow frequently should not be common, so we take it out.
       supports_incremental_style: false,
       idempotent: false,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "overflow-y",
@@ -4162,6 +4232,7 @@
       // See comment on overflow-x.
       supports_incremental_style: false,
       idempotent: false,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "overscroll-behavior-inline",
@@ -4230,7 +4301,7 @@
       },
       supports_incremental_style: true,
       valid_for_permission_element: true,
-      invalidate: ["scroll-anchor"],
+      invalidate: ["layout", "paint", "scroll-anchor"],
     },
     {
       name: "padding-left",
@@ -4251,7 +4322,7 @@
       },
       supports_incremental_style: true,
       valid_for_permission_element: true,
-      invalidate: ["scroll-anchor"],
+      invalidate: ["layout", "paint", "scroll-anchor"],
     },
     {
       name: "padding-right",
@@ -4272,7 +4343,7 @@
       },
       supports_incremental_style: true,
       valid_for_permission_element: true,
-      invalidate: ["scroll-anchor"],
+      invalidate: ["layout", "paint", "scroll-anchor"],
     },
     {
       name: "padding-top",
@@ -4293,7 +4364,7 @@
       },
       supports_incremental_style: true,
       valid_for_permission_element: true,
-      invalidate: ["scroll-anchor"],
+      invalidate: ["layout", "paint", "scroll-anchor"],
     },
     {
       name: "page",
@@ -4333,6 +4404,7 @@
       converter: "ConvertPaintOrder",
       keywords: ["normal", "fill", "stroke", "markers"],
       typedom_types: ["Keyword"],
+      invalidate: ["paint"],
     },
     {
       name: "perspective",
@@ -4415,6 +4487,7 @@
       // Needs to be applied before inset-area which in turn needs to be applied
       // before inset properties.
       priority: 2,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "position-try-options",
@@ -4428,6 +4501,7 @@
       wrapper_pointer_name: "Member",
       type_name: "PositionTryOptions",
       default_value: "nullptr",
+      invalidate: ["layout", "paint"],
       runtime_flag: "CSSAnchorPositioning",
     },
     {
@@ -4438,6 +4512,7 @@
       keywords: ["normal", "most-width", "most-height", "most-block-size", "most-inline-size"],
       typedom_types: ["Keyword"],
       default_value: "normal",
+      invalidate: ["layout", "paint"],
       runtime_flag: "CSSPositionTryOrder",
     },
     {
@@ -4453,6 +4528,7 @@
       // TODO(crbug.com/332933527): Support anchors-valid.
       keywords: ["always", "anchors-visible", "no-overflow"],
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
       runtime_flag: "CSSPositionVisibility",
     },
     {
@@ -4470,6 +4546,7 @@
       typedom_types: ["Keyword"],
       computable: false,
       valid_for_page_context: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "content-visibility",
@@ -4503,6 +4580,7 @@
       keywords: ["none", "both", "horizontal", "vertical", "block", "inline"],
       typedom_types: ["Keyword"],
       default_value: "none",
+      invalidate: ["paint"],
     },
     {
       name: "right",
@@ -4535,6 +4613,7 @@
       typedom_types: ["Length", "Percentage"],
       converter: "ConvertLength",
       supports_incremental_style: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "rx",
@@ -4547,6 +4626,7 @@
       typedom_types: ["Keyword", "Length", "Percentage"],
       converter: "ConvertLengthOrAuto",
       supports_incremental_style: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "ry",
@@ -4559,6 +4639,7 @@
       typedom_types: ["Keyword", "Length", "Percentage"],
       converter: "ConvertLengthOrAuto",
       supports_incremental_style: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "scroll-markers",
@@ -4611,6 +4692,7 @@
       keywords: ["auto", "thin", "none"],
       default_value: "auto",
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
       runtime_flag: "ScrollbarWidth",
     },
     {
@@ -5053,6 +5135,7 @@
       converter: "ConvertLength",
       keywords: ["none"],
       typedom_types: ["Length", "Percentage"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "shape-outside",
@@ -5068,6 +5151,7 @@
       computed_style_custom_functions: ["getter"],
       converter: "ConvertShapeValue",
       keywords: ["none"],
+      invalidate: ["paint"],
     },
     {
       name: "shape-rendering",
@@ -5078,6 +5162,7 @@
       keywords: ["auto", "optimizespeed", "crispedges", "geometricprecision"],
       default_value: "auto",
       typedom_types: ["Keyword"],
+      invalidate: ["paint"],
     },
     {
       name: "size",
@@ -5116,6 +5201,7 @@
       converter: "ConvertStyleColor",
       keywords: ["currentcolor"],
       typedom_types: ["Keyword"],
+      invalidate: ["paint"],
     },
     {
       name: "stop-opacity",
@@ -5128,6 +5214,7 @@
       converter: "ConvertAlpha",
       typedom_types: ["Number"],
       accepts_numeric_literal: true,
+      invalidate: ["paint"],
     },
     {
       name: "stroke",
@@ -5147,6 +5234,7 @@
       },
       valid_for_highlight_legacy: true,
       valid_for_highlight: true,
+      invalidate: ["paint"],
     },
     {
       name: "stroke-dasharray",
@@ -5176,6 +5264,7 @@
       name_for_methods: "StrokeDashOffset",
       converter: "ConvertLength",
       typedom_types: ["Length", "Percentage"],
+      invalidate: ["paint"],
     },
     {
       name: "stroke-linecap",
@@ -5189,6 +5278,7 @@
       name_for_methods: "CapStyle",
       keywords: ["butt", "round", "square"],
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "stroke-linejoin",
@@ -5202,6 +5292,7 @@
       name_for_methods: "JoinStyle",
       keywords: ["miter", "bevel", "round"],
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "stroke-miterlimit",
@@ -5214,6 +5305,7 @@
       default_value: "4",
       name_for_methods: "StrokeMiterLimit",
       typedom_types: ["Number"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "stroke-opacity",
@@ -5227,6 +5319,7 @@
       converter: "ConvertAlpha",
       typedom_types: ["Number"],
       accepts_numeric_literal: true,
+      invalidate: ["paint"],
     },
     {
       name: "stroke-width",
@@ -5242,6 +5335,7 @@
       typedom_types: ["Length", "Percentage"],
       valid_for_highlight_legacy: true,
       valid_for_highlight: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "table-layout",
@@ -5269,6 +5363,7 @@
       computed_style_custom_functions: ["setter"],
       typedom_types: ["Number", "Length"],
       valid_for_marker: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "text-align",
@@ -5286,6 +5381,7 @@
       style_builder_custom_functions: ["value"],
       valid_for_formatted_text: true,
       valid_for_page_context: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "text-align-last",
@@ -5297,6 +5393,7 @@
       default_value: "auto",
       typedom_types: ["Keyword"],
       valid_for_page_context: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "text-anchor",
@@ -5307,6 +5404,7 @@
       keywords: ["start", "middle", "end"],
       default_value: "start",
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "text-autospace",
@@ -5325,7 +5423,8 @@
       property_methods: ["ParseSingleValueFromRange", "CSSValueFromComputedStyleInternal"],
       inherited: true,
       field_group: "*",
-      field_template: "external",
+      field_template: "primitive",
+      field_size: 6,  // Sync with `TextBoxEdge::kBits`.
       include_paths: ["third_party/blink/renderer/core/style/text_box_edge.h"],
       default_value: "TextBoxEdge()",
       type_name: "TextBoxEdge",
@@ -5355,6 +5454,7 @@
       valid_for_marker: true,
       computable: false,
       valid_for_formatted_text: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "text-decoration-color",
@@ -5472,6 +5572,7 @@
       style_builder_custom_functions: ["value"],
       typedom_types: ["Length", "Percentage"],
       valid_for_page_context: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "text-overflow",
@@ -5483,6 +5584,7 @@
       default_value: "clip",
       valid_for_formatted_text: true,
       valid_for_page_context: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "text-shadow",
@@ -5507,6 +5609,7 @@
       valid_for_formatted_text: true,
       valid_for_formatted_text_run: true,
       valid_for_page_context: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "text-size-adjust",
@@ -5522,6 +5625,7 @@
       converter: "ConvertTextSizeAdjust",
       keywords: ["none", "auto"],
       typedom_types: ["Keyword", "Percentage"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "text-spacing",
@@ -5776,6 +5880,7 @@
       keywords: ["none", "non-scaling-stroke"],
       typedom_types: ["Keyword"],
       default_value: "none",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "vertical-align",
@@ -5860,6 +5965,7 @@
       valid_for_cue: true,
       valid_for_permission_element: true,
       valid_for_page_context: true,
+      invalidate: ["paint"],
     },
     {
       name: "x",
@@ -5872,6 +5978,7 @@
       converter: "ConvertLength",
       supports_incremental_style: true,
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "y",
@@ -5884,6 +5991,7 @@
       converter: "ConvertLength",
       supports_incremental_style: true,
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "appearance",
@@ -5898,6 +6006,7 @@
       // appearance needs to be computed before
       // -internal-appearance-auto-base-select() can be resolved.
       priority: 1,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-appearance",
@@ -5930,6 +6039,7 @@
       type_name: "short",
       converter: "ConvertComputedLength<short>",
       valid_for_first_letter: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-border-image",
@@ -5952,6 +6062,7 @@
       type_name: "short",
       converter: "ConvertComputedLength<short>",
       valid_for_first_letter: true,
+      invalidate: ["layout", "paint"],
     },
     // For valid values of box-align see
     // http://www.w3.org/TR/2009/WD-css3-flexbox-20090723/#alignment
@@ -5964,6 +6075,7 @@
       default_value: "stretch",
       type_name: "EBoxAlignment",
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-box-decoration-break",
@@ -5972,6 +6084,7 @@
       field_template: "keyword",
       keywords: ["slice", "clone"],
       default_value: "slice",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-box-direction",
@@ -5980,6 +6093,7 @@
       keywords: ["normal", "reverse"],
       default_value: "normal",
       computed_style_protected_functions: ["getter"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-box-flex",
@@ -5989,6 +6103,7 @@
       default_value: "0.0f",
       type_name: "float",
       accepts_numeric_literal: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-box-ordinal-group",
@@ -5999,6 +6114,7 @@
       type_name: "unsigned",
       computed_style_custom_functions: ["setter"],
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-box-orient",
@@ -6007,6 +6123,7 @@
       field_template: "keyword",
       keywords: ["horizontal", "vertical"],
       default_value: "horizontal",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-box-pack",
@@ -6015,6 +6132,7 @@
       field_template: "keyword",
       keywords: ["start", "center", "end", "justify"],
       default_value: "start",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-box-reflect",
@@ -6040,6 +6158,7 @@
       style_builder_template: "auto",
       keywords: ["auto"],
       typedom_types: ["Keyword", "Number"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "column-gap",
@@ -6053,6 +6172,7 @@
       converter: "ConvertGapLength",
       keywords: ["normal"],
       typedom_types: ["Keyword", "Length", "Percentage"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "row-gap",
@@ -6066,6 +6186,7 @@
       converter: "ConvertGapLength",
       keywords: ["normal"],
       typedom_types: ["Keyword", "Length", "Percentage"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "column-rule-color",
@@ -6081,6 +6202,7 @@
       typedom_types: ["Keyword"],
       converter: "ConvertStyleColor",
       style_builder_template: "color",
+      invalidate: ["paint"],
     },
     {
       name: "column-rule-style",
@@ -6094,6 +6216,7 @@
       default_value: "none",
       type_name: "EBorderStyle",
       typedom_types: ["Keyword"],
+      invalidate: ["paint"],
     },
     {
       name: "column-rule-width",
@@ -6107,6 +6230,7 @@
       converter: "ConvertColumnRuleWidth",
       keywords: ["thin", "medium", "thick"],
       typedom_types: ["Keyword", "Length"],
+      invalidate: ["paint"],
     },
     {
       name: "column-span",
@@ -6117,6 +6241,7 @@
       default_value: "none",
       getter: "GetColumnSpan",
       typedom_types: ["Keyword"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "column-width",
@@ -6131,6 +6256,7 @@
       converter: "ConvertComputedLength<float>",
       keywords: ["auto"],
       typedom_types: ["Keyword", "Length"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "hyphenate-character",
@@ -6143,6 +6269,7 @@
       name_for_methods: "HyphenationString",
       type_name: "AtomicString",
       converter: "ConvertString<CSSValueID::kAuto>",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-line-break",
@@ -6154,6 +6281,7 @@
       default_value: "auto",
       type_name: "LineBreak",
       valid_for_formatted_text: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "line-break",
@@ -6185,6 +6313,7 @@
       field_template: "primitive",
       default_value: "0",
       type_name: "int",
+      invalidate: ["layout", "paint"],
       name_for_methods: "WebkitLineClamp",
     },
     {
@@ -6364,6 +6493,7 @@
       keywords: ["economy", "exact"],
       default_value: "economy",
       valid_for_permission_element: true,
+      invalidate: ["paint"],
     },
     {
       name: "-webkit-rtl-ordering",
@@ -6400,6 +6530,7 @@
       converter: "ConvertRubyPosition",
       valid_for_first_line: true,
       valid_for_permission_element: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-tap-highlight-color",
@@ -6450,6 +6581,7 @@
       type_name: "TextEmphasisPosition",
       converter: "ConvertTextTextEmphasisPosition",
       valid_for_marker: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "text-emphasis-style",
@@ -6482,6 +6614,7 @@
       field_template: "keyword",
       keywords: ["none", "disc", "circle", "square"],
       default_value: "none",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-text-stroke-color",
@@ -6511,6 +6644,7 @@
       converter: "ConvertTextStrokeWidth",
       valid_for_highlight_legacy: true,
       valid_for_highlight: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "-webkit-transform-origin-x",
@@ -6553,6 +6687,7 @@
       keywords: ["auto", "none", "element"],
       default_value: "auto",
       valid_for_permission_element: true,
+      invalidate: ["paint"],
     },
     {
       name: "-webkit-user-modify",
@@ -6564,6 +6699,7 @@
       keywords: ["read-only", "read-write", "read-write-plaintext-only"],
       default_value: "read-only",
       affected_by_all: false,
+      invalidate: ["paint"],
     },
     {
       name: "user-select",
@@ -6576,6 +6712,7 @@
       typedom_types: ["Keyword"],
       default_value: "auto",
       valid_for_permission_element: true,
+      invalidate: ["paint"],
     },
     {
       name: "white-space",
@@ -6673,6 +6810,7 @@
       default_value: "normal",
       typedom_types: ["Keyword"],
       valid_for_marker: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "word-spacing",
@@ -7394,7 +7532,7 @@
       // anchor() functions compute relative to the containing block that is
       // modified by inset-area in AnchorEvaluatorImpl.
       priority: 1,
-      invalidate: ["out-of-flow"],
+      invalidate: ["layout", "out-of-flow", "paint"],
     },
 
     // Shorthands
@@ -8156,6 +8294,7 @@
       computed_style_protected_functions: ["getter"],
       converter: "ConvertStyleColor",
       style_builder_template: "visited_color",
+      invalidate: ["paint"],
     },
     {
       name: "-internal-visited-background-color",
@@ -8343,6 +8482,7 @@
       },
       valid_for_highlight_legacy: true,
       valid_for_highlight: true,
+      invalidate: ["paint"],
     },
     {
       name: "-internal-visited-text-decoration-color",
diff --git a/third_party/blink/renderer/core/css/css_value_keywords.json5 b/third_party/blink/renderer/core/css/css_value_keywords.json5
index aed16a8..fe2c4dc 100644
--- a/third_party/blink/renderer/core/css/css_value_keywords.json5
+++ b/third_party/blink/renderer/core/css/css_value_keywords.json5
@@ -286,6 +286,12 @@
     // <https://github.com/w3c/csswg-drafts/issues/7522>
     "-internal-spelling-error-color",
     "-internal-grammar-error-color",
+    // ::search-text
+    // <https://github.com/w3c/csswg-drafts/issues/10329>
+    "-internal-search-color",
+    "-internal-search-text-color",
+    "-internal-current-search-color",
+    "-internal-current-search-text-color",
 
     //
     // "Extended" named colors
diff --git a/third_party/blink/renderer/core/css/element_rule_collector.cc b/third_party/blink/renderer/core/css/element_rule_collector.cc
index 3f24b51..b6426d9 100644
--- a/third_party/blink/renderer/core/css/element_rule_collector.cc
+++ b/third_party/blink/renderer/core/css/element_rule_collector.cc
@@ -88,6 +88,20 @@
     context.pseudo_id = pseudo_style_request->pseudo_id;
     context.pseudo_argument = &pseudo_style_request->pseudo_argument;
     context.vtt_originating_element = match_request.VTTOriginatingElement();
+    switch (pseudo_style_request->search_text_request) {
+      case StyleRequest::kNone:
+        DCHECK_NE(context.pseudo_id, kPseudoIdSearchText);
+        break;
+      case StyleRequest::kCurrent:
+        context.search_text_request_is_current = true;
+        break;
+      case StyleRequest::kNotCurrent:
+        context.search_text_request_is_current = false;
+        break;
+      default:
+        NOTREACHED();
+        break;
+    }
   }
 
   // This StyleScopeFrame is effectively ignored if the StyleRecalcContext
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc
index 131ccf8..51c90544 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc
@@ -431,12 +431,14 @@
 
 TEST(CSSParserFastPathsTest, InternalColorsOnlyAllowedInUaMode) {
   Color color;
+
   EXPECT_EQ(ParseColorResult::kKeyword,
             CSSParserFastPaths::ParseColor("blue", kHTMLStandardMode, color));
   EXPECT_EQ(ParseColorResult::kKeyword,
             CSSParserFastPaths::ParseColor("blue", kHTMLQuirksMode, color));
   EXPECT_EQ(ParseColorResult::kKeyword,
             CSSParserFastPaths::ParseColor("blue", kUASheetMode, color));
+
   EXPECT_EQ(ParseColorResult::kFailure,
             CSSParserFastPaths::ParseColor("-internal-spelling-error-color",
                                            kHTMLStandardMode, color));
@@ -456,6 +458,47 @@
   EXPECT_EQ(ParseColorResult::kKeyword,
             CSSParserFastPaths::ParseColor("-internal-grammar-error-color",
                                            kUASheetMode, color));
+
+  EXPECT_EQ(ParseColorResult::kFailure,
+            CSSParserFastPaths::ParseColor("-internal-search-color",
+                                           kHTMLStandardMode, color));
+  EXPECT_EQ(ParseColorResult::kFailure,
+            CSSParserFastPaths::ParseColor("-internal-search-color",
+                                           kHTMLQuirksMode, color));
+  EXPECT_EQ(ParseColorResult::kKeyword,
+            CSSParserFastPaths::ParseColor("-internal-search-color",
+                                           kUASheetMode, color));
+
+  EXPECT_EQ(ParseColorResult::kFailure,
+            CSSParserFastPaths::ParseColor("-internal-search-text-color",
+                                           kHTMLStandardMode, color));
+  EXPECT_EQ(ParseColorResult::kFailure,
+            CSSParserFastPaths::ParseColor("-internal-search-text-color",
+                                           kHTMLQuirksMode, color));
+  EXPECT_EQ(ParseColorResult::kKeyword,
+            CSSParserFastPaths::ParseColor("-internal-search-text-color",
+                                           kUASheetMode, color));
+
+  EXPECT_EQ(ParseColorResult::kFailure,
+            CSSParserFastPaths::ParseColor("-internal-current-search-color",
+                                           kHTMLStandardMode, color));
+  EXPECT_EQ(ParseColorResult::kFailure,
+            CSSParserFastPaths::ParseColor("-internal-current-search-color",
+                                           kHTMLQuirksMode, color));
+  EXPECT_EQ(ParseColorResult::kKeyword,
+            CSSParserFastPaths::ParseColor("-internal-current-search-color",
+                                           kUASheetMode, color));
+
+  EXPECT_EQ(
+      ParseColorResult::kFailure,
+      CSSParserFastPaths::ParseColor("-internal-current-search-text-color",
+                                     kHTMLStandardMode, color));
+  EXPECT_EQ(ParseColorResult::kFailure,
+            CSSParserFastPaths::ParseColor(
+                "-internal-current-search-text-color", kHTMLQuirksMode, color));
+  EXPECT_EQ(ParseColorResult::kKeyword,
+            CSSParserFastPaths::ParseColor(
+                "-internal-current-search-text-color", kUASheetMode, color));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils_test.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils_test.cc
index d8583a6b..5a16102 100644
--- a/third_party/blink/renderer/core/css/properties/css_parsing_utils_test.cc
+++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils_test.cc
@@ -285,6 +285,17 @@
       {"-internal-grammar-error-color",
        CSSIdentifierValue::Create(CSSValueID::kInternalGrammarErrorColor),
        nullptr},
+      {"-internal-search-color",
+       CSSIdentifierValue::Create(CSSValueID::kInternalSearchColor), nullptr},
+      {"-internal-search-text-color",
+       CSSIdentifierValue::Create(CSSValueID::kInternalSearchTextColor),
+       nullptr},
+      {"-internal-current-search-color",
+       CSSIdentifierValue::Create(CSSValueID::kInternalCurrentSearchColor),
+       nullptr},
+      {"-internal-current-search-text-color",
+       CSSIdentifierValue::Create(CSSValueID::kInternalCurrentSearchTextColor),
+       nullptr},
   };
   for (auto& expectation : expectations) {
     EXPECT_EQ(ConsumeColorForTest(expectation.css_text, kHTMLStandardMode),
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
index 63c07c3c..1c4c9796 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -1987,10 +1987,15 @@
     PseudoId pseudo_id,
     const AtomicString& view_transition_name,
     unsigned rules_to_include) {
-  collector.SetPseudoElementStyleRequest(StyleRequest(
-      pseudo_id,
-      /* parent_style */ nullptr,
-      /* originating_element_style */ nullptr, view_transition_name));
+  StyleRequest style_request{pseudo_id,
+                             /* parent_style */ nullptr,
+                             /* originating_element_style */ nullptr,
+                             view_transition_name};
+  if (pseudo_id == kPseudoIdSearchText) {
+    // TODO(crbug.com/339298411): handle :current?
+    style_request.search_text_request = StyleRequest::kNotCurrent;
+  }
+  collector.SetPseudoElementStyleRequest(style_request);
 
   if (rules_to_include & kUACSSRules) {
     MatchUARules(element, collector);
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc b/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc
index 734ffae..5a96c7de 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc
@@ -229,8 +229,9 @@
     }
   }
 
-  if (StyleBuilder().StyleType() == kPseudoIdTargetText) {
-    // Do not load any resources for ::target-text since that could leak text
+  if (StyleBuilder().StyleType() == kPseudoIdSearchText ||
+      StyleBuilder().StyleType() == kPseudoIdTargetText) {
+    // Do not load any resources for these pseudos, since that could leak text
     // content to external stylesheets.
     return;
   }
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.cc b/third_party/blink/renderer/core/css/rule_feature_set.cc
index cd7fa0ca..83736cd 100644
--- a/third_party/blink/renderer/core/css/rule_feature_set.cc
+++ b/third_party/blink/renderer/core/css/rule_feature_set.cc
@@ -121,6 +121,7 @@
     case CSSSelector::kPseudoInvalid:
     case CSSSelector::kPseudoIndeterminate:
     case CSSSelector::kPseudoTarget:
+    case CSSSelector::kPseudoCurrent:
     case CSSSelector::kPseudoBefore:
     case CSSSelector::kPseudoAfter:
     case CSSSelector::kPseudoMarker:
@@ -192,6 +193,7 @@
     case CSSSelector::kPseudoIs:
     case CSSSelector::kPseudoWhere:
     case CSSSelector::kPseudoParent:  // Same as kPseudoIs.
+    case CSSSelector::kPseudoSearchText:
     case CSSSelector::kPseudoTargetText:
     case CSSSelector::kPseudoHighlight:
     case CSSSelector::kPseudoSpellingError:
diff --git a/third_party/blink/renderer/core/css/selector_checker.cc b/third_party/blink/renderer/core/css/selector_checker.cc
index 6ed6eb98..63a00055 100644
--- a/third_party/blink/renderer/core/css/selector_checker.cc
+++ b/third_party/blink/renderer/core/css/selector_checker.cc
@@ -387,6 +387,7 @@
   }
 
   next_context.has_selection_pseudo = dynamic_pseudo == kPseudoIdSelection;
+  next_context.has_search_text_pseudo = dynamic_pseudo == kPseudoIdSearchText;
   next_context.is_sub_selector = true;
   return MatchSelector(next_context, result);
 }
@@ -2049,6 +2050,11 @@
       return false;
     case CSSSelector::kPseudoTrue:
       return true;
+    case CSSSelector::kPseudoCurrent:
+      if (!context.has_search_text_pseudo) {
+        return false;
+      }
+      return context.search_text_request_is_current;
     case CSSSelector::kPseudoUnknown:
     default:
       NOTREACHED_IN_MIGRATION();
diff --git a/third_party/blink/renderer/core/css/selector_checker.h b/third_party/blink/renderer/core/css/selector_checker.h
index f5f0123..673c245 100644
--- a/third_party/blink/renderer/core/css/selector_checker.h
+++ b/third_party/blink/renderer/core/css/selector_checker.h
@@ -160,6 +160,7 @@
     bool in_rightmost_compound = true;
     bool has_scrollbar_pseudo = false;
     bool has_selection_pseudo = false;
+    bool has_search_text_pseudo = false;
     bool treat_shadow_host_as_normal_scope = false;
     bool in_nested_complex_selector = false;
     // If true, elements that are links will match :visited. Otherwise,
@@ -174,6 +175,8 @@
     bool had_match_visited = false;
     bool pseudo_has_in_rightmost_compound = true;
     bool is_inside_has_pseudo_class = false;
+    // Affects whether or not :current matches after a ::search-text.
+    bool search_text_request_is_current = false;
   };
 
   struct MatchResult {
diff --git a/third_party/blink/renderer/core/css/style_color.cc b/third_party/blink/renderer/core/css/style_color.cc
index 3dc162ba..33f673e 100644
--- a/third_party/blink/renderer/core/css/style_color.cc
+++ b/third_party/blink/renderer/core/css/style_color.cc
@@ -183,8 +183,15 @@
   //   '-internal-spelling-error-color'
   //   '-internal-grammar-error-color'
   //
+  // ::search-text
+  // <https://github.com/w3c/csswg-drafts/issues/10329>
+  //   ‘-internal-search-color’
+  //   ‘-internal-search-text-color’
+  //   ‘-internal-current-search-color’
+  //   ‘-internal-current-search-text-color’
+  //
   return (id >= CSSValueID::kAqua &&
-          id <= CSSValueID::kInternalGrammarErrorColor) ||
+          id <= CSSValueID::kInternalCurrentSearchTextColor) ||
          (id >= CSSValueID::kAliceblue && id <= CSSValueID::kYellowgreen) ||
          id == CSSValueID::kMenu;
 }
@@ -222,6 +229,10 @@
     case CSSValueID::kHighlighttext:
     case CSSValueID::kInternalGrammarErrorColor:
     case CSSValueID::kInternalSpellingErrorColor:
+    case CSSValueID::kInternalSearchColor:
+    case CSSValueID::kInternalSearchTextColor:
+    case CSSValueID::kInternalCurrentSearchColor:
+    case CSSValueID::kInternalCurrentSearchTextColor:
     case CSSValueID::kLinktext:
     case CSSValueID::kMark:
     case CSSValueID::kMarktext:
diff --git a/third_party/blink/renderer/core/css/style_request.h b/third_party/blink/renderer/core/css/style_request.h
index 3c722b3..02bad757 100644
--- a/third_party/blink/renderer/core/css/style_request.h
+++ b/third_party/blink/renderer/core/css/style_request.h
@@ -42,6 +42,7 @@
  public:
   enum RequestType { kForRenderer, kForComputedStyle };
   enum RulesToInclude { kUAOnly, kAll };
+  enum SearchTextRequest { kNone, kCurrent, kNotCurrent };
 
   StyleRequest() = default;
 
@@ -65,6 +66,7 @@
   Vector<AtomicString> pseudo_ident_list;
   RulesToInclude rules_to_include{kAll};
   bool can_trigger_animations{true};
+  SearchTextRequest search_text_request{kNone};
 
   explicit StyleRequest(const ComputedStyle* parent_override)
       : parent_override(parent_override),
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 2de0c1d..396f3a5 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -5133,6 +5133,31 @@
     }
   }
 
+  if (RuntimeEnabledFeatures::SearchTextHighlightPseudoEnabled() &&
+      UsesHighlightPseudoInheritance(kPseudoIdSearchText) &&
+      new_style.HasPseudoElementStyle(kPseudoIdSearchText)) {
+    const ComputedStyle* highlight_parent_current =
+        parent_highlights ? parent_highlights->SearchTextCurrent() : nullptr;
+    if (ShouldRecalcHighlightPseudoStyle(highlight_recalc,
+                                         highlight_parent_current, new_style,
+                                         style_recalc_context.container)) {
+      builder.AccessHighlightData().SetSearchTextCurrent(
+          StyleForSearchTextPseudoElement(style_recalc_context,
+                                          highlight_parent_current, new_style,
+                                          StyleRequest::kCurrent));
+    }
+    const ComputedStyle* highlight_parent_not_current =
+        parent_highlights ? parent_highlights->SearchTextNotCurrent() : nullptr;
+    if (ShouldRecalcHighlightPseudoStyle(
+            highlight_recalc, highlight_parent_not_current, new_style,
+            style_recalc_context.container)) {
+      builder.AccessHighlightData().SetSearchTextNotCurrent(
+          StyleForSearchTextPseudoElement(
+              style_recalc_context, highlight_parent_not_current, new_style,
+              StyleRequest::kNotCurrent));
+    }
+  }
+
   if (UsesHighlightPseudoInheritance(kPseudoIdTargetText) &&
       new_style.HasPseudoElementStyle(kPseudoIdTargetText)) {
     const ComputedStyle* highlight_parent =
@@ -7506,6 +7531,11 @@
     return element_style;
   }
 
+  if (pseudo_element_specifier == kPseudoIdSearchText &&
+      !RuntimeEnabledFeatures::SearchTextHighlightPseudoEnabled()) {
+    return nullptr;
+  }
+
   if (const ComputedStyle* pseudo_element_style =
           element_style->GetCachedPseudoElementStyle(pseudo_element_specifier,
                                                      pseudo_argument)) {
@@ -7524,6 +7554,12 @@
   StyleRequest style_request;
   style_request.pseudo_id = pseudo_element_specifier;
   style_request.type = StyleRequest::kForComputedStyle;
+  if (style_request.pseudo_id == kPseudoIdSearchText) {
+    // getComputedStyle for ::search-text is always :not(:current);
+    // see <https://github.com/w3c/csswg-drafts/issues/10297>.
+    DCHECK_EQ(style_request.type, StyleRequest::kForComputedStyle);
+    style_request.search_text_request = StyleRequest::kNotCurrent;
+  }
   if (UsesHighlightPseudoInheritance(pseudo_element_specifier)) {
     const ComputedStyle* highlight_element_style = nullptr;
     if (Element* parent = LayoutTreeBuilderTraversal::ParentElement(*this)) {
@@ -8094,6 +8130,17 @@
   return StyleForPseudoElement(style_recalc_context, style_request);
 }
 
+const ComputedStyle* Element::StyleForSearchTextPseudoElement(
+    const StyleRecalcContext& style_recalc_context,
+    const ComputedStyle* highlight_parent,
+    const ComputedStyle& originating_style,
+    StyleRequest::SearchTextRequest search_text_request) {
+  StyleRequest style_request{kPseudoIdSearchText, highlight_parent,
+                             &originating_style};
+  style_request.search_text_request = search_text_request;
+  return StyleForPseudoElement(style_recalc_context, style_request);
+}
+
 bool Element::CanGeneratePseudoElement(PseudoId pseudo_id) const {
   if (pseudo_id == kPseudoIdViewTransition) {
     DCHECK_EQ(this, GetDocument().documentElement());
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h
index 09363f6c..1d2d539 100644
--- a/third_party/blink/renderer/core/dom/element.h
+++ b/third_party/blink/renderer/core/dom/element.h
@@ -40,6 +40,7 @@
 #include "third_party/blink/renderer/core/css/css_selector.h"
 #include "third_party/blink/renderer/core/css/resolver/cascade_filter.h"
 #include "third_party/blink/renderer/core/css/style_recalc_change.h"
+#include "third_party/blink/renderer/core/css/style_request.h"
 #include "third_party/blink/renderer/core/dom/container_node.h"
 #include "third_party/blink/renderer/core/dom/dom_high_res_time_stamp.h"
 #include "third_party/blink/renderer/core/dom/element_data.h"
@@ -122,7 +123,6 @@
 class StylePropertyMap;
 class StylePropertyMapReadOnly;
 class StyleRecalcContext;
-class StyleRequest;
 class StyleScopeData;
 class TextVisitor;
 class V8UnionBooleanOrScrollIntoViewOptions;
@@ -1077,7 +1077,7 @@
   const ComputedStyle* StyleForPseudoElement(const StyleRecalcContext&,
                                              const StyleRequest&);
 
-  // This is used by ResolveStyle with Highlight Inheritance when caching
+  // These are used by ResolveStyle with Highlight Inheritance when caching
   // is not used.
   const ComputedStyle* StyleForHighlightPseudoElement(
       const StyleRecalcContext& style_recalc_context,
@@ -1085,6 +1085,11 @@
       const ComputedStyle& originating_style,
       const PseudoId pseudo_id,
       const AtomicString& pseudo_argument = g_null_atom);
+  const ComputedStyle* StyleForSearchTextPseudoElement(
+      const StyleRecalcContext& style_recalc_context,
+      const ComputedStyle* highlight_parent,
+      const ComputedStyle& originating_style,
+      StyleRequest::SearchTextRequest search_text_request);
 
   virtual bool CanGeneratePseudoElement(PseudoId) const;
 
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 3eb55bc3..fc2e1b5 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -4915,24 +4915,26 @@
   DCHECK(GetFrame().IsLocalRoot() || !IsAttached());
   bool updated = false;
   ForAllNonThrottledLocalFrameViews([&updated](LocalFrameView& frame_view) {
-    if (frame_view.pending_opacity_updates_) {
+    if (frame_view.pending_opacity_updates_ &&
+        !frame_view.pending_opacity_updates_->empty()) {
       for (LayoutObject* object : *frame_view.pending_opacity_updates_) {
         DCHECK(
             !DisplayLockUtilities::LockedAncestorPreventingPrePaint(*object));
         PaintPropertyTreeBuilder::DirectlyUpdateOpacityValue(*object);
-        updated = true;
       }
+      updated = true;
       frame_view.pending_opacity_updates_->clear();
     }
-    if (frame_view.pending_transform_updates_) {
+    if (frame_view.pending_transform_updates_ &&
+        !frame_view.pending_transform_updates_->empty()) {
       for (LayoutObject* object : *frame_view.pending_transform_updates_) {
         DCHECK(
             !DisplayLockUtilities::LockedAncestorPreventingPrePaint(*object));
         PaintPropertyTreeBuilder::DirectlyUpdateTransformMatrix(*object);
-        updated = true;
       }
-      frame_view.pending_transform_updates_->clear();
+      updated = true;
       frame_view.SetIntersectionObservationState(kDesired);
+      frame_view.pending_transform_updates_->clear();
     }
   });
   return updated;
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc
index 23d1cb0..721bf23 100644
--- a/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc
+++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc
@@ -550,6 +550,23 @@
   EXPECT_FALSE(GetDocument().GetLayoutView()->NeedsPaintPropertyUpdate());
   EXPECT_FALSE(
       GetDocument().GetLayoutView()->DescendantNeedsPaintPropertyUpdate());
+  GetDocument().View()->UpdateLifecycleToPrePaintClean(
+      DocumentUpdateReason::kTest);
+  EXPECT_EQ(LocalFrameView::kDesired,
+            GetDocument().View()->GetIntersectionObservationStateForTesting());
+  Compositor().BeginFrame();
+  test::RunPendingTasks();
+  ASSERT_FALSE(Compositor().NeedsBeginFrame());
+
+  EXPECT_EQ(target_observer_delegate->CallCount(), 2);
+  EXPECT_EQ(target_observer_delegate->EntryCount(), 2);
+  EXPECT_FALSE(target_observer_delegate->LastEntry()->isIntersecting());
+
+  container->SetInlineStyleProperty(CSSPropertyID::kColor, "yellow");
+  GetDocument().View()->UpdateLifecycleToPrePaintClean(
+      DocumentUpdateReason::kTest);
+  EXPECT_EQ(LocalFrameView::kNotNeeded,
+            GetDocument().View()->GetIntersectionObservationStateForTesting());
   Compositor().BeginFrame();
   test::RunPendingTasks();
   ASSERT_FALSE(Compositor().NeedsBeginFrame());
diff --git a/third_party/blink/renderer/core/layout/inline/inline_items_builder.cc b/third_party/blink/renderer/core/layout/inline/inline_items_builder.cc
index 4c5e320b..a81c518 100644
--- a/third_party/blink/renderer/core/layout/inline/inline_items_builder.cc
+++ b/third_party/blink/renderer/core/layout/inline/inline_items_builder.cc
@@ -24,6 +24,32 @@
 namespace blink {
 class HTMLAreaElement;
 
+template <typename MappingBuilder>
+InlineItemsBuilderTemplate<MappingBuilder>::InlineItemsBuilderTemplate(
+    LayoutBlockFlow* block_flow,
+    HeapVector<InlineItem>* items,
+    const String& previous_text_content,
+    const SvgTextChunkOffsets* chunk_offsets)
+    : block_flow_(block_flow),
+      items_(items),
+      text_chunk_offsets_(chunk_offsets),
+      is_text_combine_(block_flow_->IsLayoutTextCombine()) {
+  if (!RuntimeEnabledFeatures::RecollectInlinesReserveCapacityEnabled()) {
+    return;
+  }
+  const LayoutObject* child = block_flow->FirstChild();
+  if (!previous_text_content.IsNull() && child && child->NextSibling()) {
+    // 10 avoids reallocations in many cases of Speedometer3.
+    constexpr wtf_size_t kAdditionalSize = 10;
+    wtf_size_t capacity = previous_text_content.length() + kAdditionalSize;
+    if (previous_text_content.Is8Bit()) {
+      text_.ReserveCapacity(capacity);
+    } else {
+      text_.Reserve16BitCapacity(capacity);
+    }
+  }
+}
+
 // Returns true if items builder is used for other than offset mapping.
 template <typename MappingBuilder>
 bool InlineItemsBuilderTemplate<MappingBuilder>::NeedsBoxInfo() {
diff --git a/third_party/blink/renderer/core/layout/inline/inline_items_builder.h b/third_party/blink/renderer/core/layout/inline/inline_items_builder.h
index e43a943..adbe9f4 100644
--- a/third_party/blink/renderer/core/layout/inline/inline_items_builder.h
+++ b/third_party/blink/renderer/core/layout/inline/inline_items_builder.h
@@ -47,13 +47,11 @@
 
  public:
   // Create a builder that appends items to |items|.
-  InlineItemsBuilderTemplate(LayoutBlockFlow* block_flow,
-                             HeapVector<InlineItem>* items,
-                             const SvgTextChunkOffsets* chunk_offsets = nullptr)
-      : block_flow_(block_flow),
-        items_(items),
-        text_chunk_offsets_(chunk_offsets),
-        is_text_combine_(block_flow_->IsLayoutTextCombine()) {}
+  InlineItemsBuilderTemplate(
+      LayoutBlockFlow* block_flow,
+      HeapVector<InlineItem>* items,
+      const String& previous_text_content = String(),
+      const SvgTextChunkOffsets* chunk_offsets = nullptr);
   ~InlineItemsBuilderTemplate();
 
   LayoutBlockFlow* GetLayoutBlockFlow() const { return block_flow_; }
diff --git a/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.cc b/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.cc
index d6b9971..67e0a0d 100644
--- a/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.cc
@@ -585,7 +585,7 @@
   container_builder_.SetInlineSize(inline_size);
 }
 
-void InlineLayoutAlgorithm::ApplyTextBoxTrim(const LineInfo& line_info) {
+void InlineLayoutAlgorithm::ApplyTextBoxTrim(LineInfo& line_info) {
   const ConstraintSpace& space = GetConstraintSpace();
   const bool should_apply_start =
       space.ShouldTextBoxTrimStart() && line_info.IsFirstFormattedLine();
@@ -624,6 +624,11 @@
             ? offset_for_trimming_box +
                   container_builder_.LineBoxBfcBlockOffset().value()
             : offset_for_trimming_box);
+
+    // Cancel adjusting the block start for the Ruby annotation. The use of the
+    // `text-box-trim` accepts the risk of collisions for the finer control of
+    // the alignment of the body text in the block direction.
+    line_info.SetAnnotationBlockStartAdjustment(LayoutUnit());
   }
 
   if (should_apply_end) {
diff --git a/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.h b/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.h
index 2ad7a7c..7376385 100644
--- a/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm.h
@@ -89,7 +89,7 @@
 
   LayoutUnit ApplyTextAlign(LineInfo*);
 
-  void ApplyTextBoxTrim(const LineInfo&);
+  void ApplyTextBoxTrim(LineInfo&);
 
   // Add any trailing clearance requested by a BR 'clear' attribute on the line.
   // Return true if this was successful (this also includes cases where there is
diff --git a/third_party/blink/renderer/core/layout/inline/inline_node.cc b/third_party/blink/renderer/core/layout/inline/inline_node.cc
index 12dceaa..11b2ecd 100644
--- a/third_party/blink/renderer/core/layout/inline/inline_node.cc
+++ b/third_party/blink/renderer/core/layout/inline/inline_node.cc
@@ -941,7 +941,9 @@
   InlineNode node(editor.GetLayoutBlockFlow());
   InlineNodeData* data = node.MutableData();
   data->items.reserve(previous_data->items.size());
-  InlineItemsBuilder builder(editor.GetLayoutBlockFlow(), &data->items);
+  InlineItemsBuilder builder(
+      editor.GetLayoutBlockFlow(), &data->items,
+      previous_data ? previous_data->text_content : String());
   // TODO(yosin): We should reuse before/after |layout_text| during collecting
   // inline items.
   layout_text->ClearInlineItems();
@@ -996,7 +998,7 @@
   ClearCollectionScope<HeapVector<InlineItem>> clear_scope(&items);
   items.reserve(EstimateInlineItemsCount(*layout_block_flow));
   InlineItemsBuilderForOffsetMapping builder(layout_block_flow, &items,
-                                             chunk_offsets);
+                                             data->text_content, chunk_offsets);
   builder.GetOffsetMappingBuilder().ReserveCapacity(
       EstimateOffsetMappingItemsCount(*layout_block_flow));
   CollectInlinesInternal(&builder, nullptr);
@@ -1065,7 +1067,9 @@
   }
 
   data->items.reserve(EstimateInlineItemsCount(*block));
-  InlineItemsBuilder builder(block, &data->items, chunk_offsets);
+  InlineItemsBuilder builder(
+      block, &data->items,
+      previous_data ? previous_data->text_content : String(), chunk_offsets);
   CollectInlinesInternal(&builder, previous_data);
   if (block->IsSVGText() && !data->svg_node_data_) {
     SvgTextLayoutAttributesBuilder svg_attr_builder(*this);
diff --git a/third_party/blink/renderer/core/layout/inline/line_breaker.cc b/third_party/blink/renderer/core/layout/inline/line_breaker.cc
index aa198c1..93122c1 100644
--- a/third_party/blink/renderer/core/layout/inline/line_breaker.cc
+++ b/third_party/blink/renderer/core/layout/inline/line_breaker.cc
@@ -912,6 +912,13 @@
           ? LineBreakState::kOverflow
           : LineBreakState::kContinue;
   trailing_whitespace_ = initial_whitespace_;
+
+  if (break_token_) {
+    if (const auto* ruby_data = break_token_->RubyData()) {
+      HandleRuby(ruby_data, line_info);
+    }
+  }
+
   while (state_ != LineBreakState::kDone) {
     // If we reach at the end of the block, this is the last line.
     DCHECK_LE(current_.item_index, items.size());
@@ -1010,7 +1017,7 @@
         MoveToNextOf(item);
         continue;
       }
-      if (!HandleRuby(line_info)) {
+      if (!HandleRuby(nullptr, line_info)) {
         AddItem(item, line_info);
         MoveToNextOf(item);
       }
@@ -3195,12 +3202,13 @@
   state_ = LineBreakState::kDone;
 }
 
-bool LineBreaker::HandleRuby(LineInfo* line_info) {
+bool LineBreaker::HandleRuby(const RubyBreakTokenData* ruby_token,
+                             LineInfo* line_info) {
   InlineItemTextIndex base_start = current_;
   wtf_size_t base_end_index;
   Vector<AnnotationBreakTokenData, 1> annotation_data;
   wtf_size_t open_column_item_index;
-  {
+  if (!ruby_token) {
     open_column_item_index = current_.item_index;
     RubyItemIndexes ruby_indexes =
         ParseRubyInInlineItems(Items(), current_.item_index);
@@ -3217,8 +3225,11 @@
     wtf_size_t start = ruby_indexes.annotation_start;
     annotation_data.push_back(AnnotationBreakTokenData{
         {start, Items()[start].StartOffset()}, start, ruby_indexes.column_end});
+  } else {
+    open_column_item_index = ruby_token->open_column_item_index;
+    base_end_index = ruby_token->ruby_base_end_item_index;
+    annotation_data = ruby_token->annotation_data;
   }
-  // TODO(crbug.com/324111880): Setup for a wrapped ruby column.
   const InlineItem& item = Items()[open_column_item_index];
 
   LineInfo base_line_info = CreateSubLineInfo(
@@ -3248,7 +3259,7 @@
     }
 
     AddRubyColumnResult(item, base_line_info, annotation_line_list,
-                        annotation_data, ruby_size, *line_info);
+                        annotation_data, ruby_size, ruby_token, *line_info);
     position_ += ruby_size;
     // Move to a kCloseRubyColumn item.
     current_ = annotation_line_list[0].End();
@@ -3293,6 +3304,7 @@
     const HeapVector<LineInfo, 1>& annotation_line_list,
     const Vector<AnnotationBreakTokenData, 1>& annotation_data_list,
     LayoutUnit ruby_size,
+    bool is_continuation,
     LineInfo& line_info) {
   CHECK_EQ(item.Type(), InlineItem::kOpenRubyColumn);
   InlineItemResult* column_result = AddEmptyItem(item, &line_info);
@@ -3306,6 +3318,7 @@
     line_info.SetMayHaveRubyOverhang();
   }
   line_info.SetHaveTextCombineOrRubyItem();
+  data->is_continuation = is_continuation;
 
   data->annotation_line_list = annotation_line_list;
   for (wtf_size_t i = 0; i < annotation_line_list.size(); ++i) {
diff --git a/third_party/blink/renderer/core/layout/inline/line_breaker.h b/third_party/blink/renderer/core/layout/inline/line_breaker.h
index ce17823..0f4e8cd 100644
--- a/third_party/blink/renderer/core/layout/inline/line_breaker.h
+++ b/third_party/blink/renderer/core/layout/inline/line_breaker.h
@@ -31,6 +31,7 @@
 class ResolvedTextLayoutAttributesIterator;
 class ShapingLineBreaker;
 struct AnnotationBreakTokenData;
+struct RubyBreakTokenData;
 
 // The line breaker needs to know which mode its in to properly handle floats.
 enum class LineBreakerMode { kContent, kMinContent, kMaxContent };
@@ -222,7 +223,10 @@
   void ComputeMinMaxContentSizeForBlockChild(const InlineItem&,
                                              InlineItemResult*);
   // Returns false if we can't handle the current InlineItem as a ruby.
-  bool HandleRuby(LineInfo* line_info);
+  // NOINLINE prevents a compiler for Android 64bit from inlining
+  // HandleRuby() twice.
+  NOINLINE bool HandleRuby(const RubyBreakTokenData* ruby_token,
+                           LineInfo* line_info);
   // `mode`: Must be kMaxContent or kContent.
   // `limit`: Must be non-negative or kIndefiniteSize, which means no auto-wrap.
   LineInfo CreateSubLineInfo(InlineItemTextIndex start,
@@ -236,6 +240,7 @@
       const HeapVector<LineInfo, 1>& annotation_line_list,
       const Vector<AnnotationBreakTokenData, 1>& annotation_data_list,
       LayoutUnit ruby_size,
+      bool is_continuation,
       LineInfo& line_info);
   bool CanBreakAfterRubyColumn(const InlineItemResult& column_result) const;
 
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index f3e08c48..d1f8afb 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -2683,41 +2683,54 @@
           GetDocument(), *style));
     }
 
-    auto HighlightPseudoUpdateDiff = [this, style,
-                                      &diff](const PseudoId pseudo) {
-      DCHECK(pseudo == kPseudoIdTargetText ||
-             pseudo == kPseudoIdSpellingError ||
-             pseudo == kPseudoIdGrammarError);
+    auto HighlightPseudoUpdateDiff =
+        [this, style, &diff](const PseudoId pseudo,
+                             const ComputedStyle* pseudo_old_style,
+                             const ComputedStyle* pseudo_new_style) {
+          DCHECK(pseudo == kPseudoIdSearchText ||
+                 pseudo == kPseudoIdTargetText ||
+                 pseudo == kPseudoIdSpellingError ||
+                 pseudo == kPseudoIdGrammarError);
 
-      if (style_->HasPseudoElementStyle(pseudo) ||
-          style->HasPseudoElementStyle(pseudo)) {
-        const ComputedStyle* pseudo_old_style =
-            style_->HighlightData().Style(pseudo);
-        const ComputedStyle* pseudo_new_style =
-            style->HighlightData().Style(pseudo);
-
-        if (pseudo_old_style && pseudo_new_style) {
-          diff.Merge(pseudo_old_style->VisualInvalidationDiff(
-              GetDocument(), *pseudo_new_style));
-        } else {
-          diff.SetNeedsNormalPaintInvalidation();
-        }
-      }
-    };
+          if (style_->HasPseudoElementStyle(pseudo) ||
+              style->HasPseudoElementStyle(pseudo)) {
+            if (pseudo_old_style && pseudo_new_style) {
+              diff.Merge(pseudo_old_style->VisualInvalidationDiff(
+                  GetDocument(), *pseudo_new_style));
+            } else {
+              diff.SetNeedsNormalPaintInvalidation();
+            }
+          }
+        };
 
     // See HighlightRegistry for ::highlight() paint invalidation.
     // TODO(rego): We don't do anything regarding ::selection, as ::selection
     // uses its own mechanism for this (see
     // LayoutObject::InvalidateSelectedChildrenOnStyleChange()). Maybe in the
     // future we could detect changes here for ::selection too.
+    if (RuntimeEnabledFeatures::SearchTextHighlightPseudoEnabled() &&
+        UsesHighlightPseudoInheritance(kPseudoIdSearchText)) {
+      HighlightPseudoUpdateDiff(kPseudoIdSearchText,
+                                style_->HighlightData().SearchTextCurrent(),
+                                style->HighlightData().SearchTextCurrent());
+      HighlightPseudoUpdateDiff(kPseudoIdSearchText,
+                                style_->HighlightData().SearchTextNotCurrent(),
+                                style->HighlightData().SearchTextNotCurrent());
+    }
     if (UsesHighlightPseudoInheritance(kPseudoIdTargetText)) {
-      HighlightPseudoUpdateDiff(kPseudoIdTargetText);
+      HighlightPseudoUpdateDiff(kPseudoIdTargetText,
+                                style_->HighlightData().TargetText(),
+                                style->HighlightData().TargetText());
     }
     if (UsesHighlightPseudoInheritance(kPseudoIdSpellingError)) {
-      HighlightPseudoUpdateDiff(kPseudoIdSpellingError);
+      HighlightPseudoUpdateDiff(kPseudoIdSpellingError,
+                                style_->HighlightData().SpellingError(),
+                                style->HighlightData().SpellingError());
     }
     if (UsesHighlightPseudoInheritance(kPseudoIdGrammarError)) {
-      HighlightPseudoUpdateDiff(kPseudoIdGrammarError);
+      HighlightPseudoUpdateDiff(kPseudoIdGrammarError,
+                                style_->HighlightData().GrammarError(),
+                                style->HighlightData().GrammarError());
     }
   }
 
diff --git a/third_party/blink/renderer/core/layout/layout_theme.cc b/third_party/blink/renderer/core/layout/layout_theme.cc
index ef422db..4b24a71c 100644
--- a/third_party/blink/renderer/core/layout/layout_theme.cc
+++ b/third_party/blink/renderer/core/layout/layout_theme.cc
@@ -552,12 +552,13 @@
     return SystemColorFromColorProvider(css_value_id, color_scheme,
                                         color_provider);
   }
-  return DefaultSystemColor(css_value_id, color_scheme);
+  return DefaultSystemColor(css_value_id, color_scheme, color_provider);
 }
 
 Color LayoutTheme::DefaultSystemColor(
     CSSValueID css_value_id,
-    mojom::blink::ColorScheme color_scheme) const {
+    mojom::blink::ColorScheme color_scheme,
+    const ui::ColorProvider* color_provider) const {
   // The source for the deprecations commented on below is
   // https://www.w3.org/TR/css-color-4/#deprecated-system-colors.
 
@@ -665,6 +666,22 @@
       return PlatformSpellingMarkerUnderlineColor();
     case CSSValueID::kInternalGrammarErrorColor:
       return PlatformGrammarMarkerUnderlineColor();
+    case CSSValueID::kInternalSearchColor:
+      return PlatformTextSearchHighlightColor(/* active_match */ false,
+                                              /* in_forced_colors */ false,
+                                              color_scheme, color_provider);
+    case CSSValueID::kInternalSearchTextColor:
+      return PlatformTextSearchColor(/* active_match */ false,
+                                     /* in_forced_colors */ false, color_scheme,
+                                     color_provider);
+    case CSSValueID::kInternalCurrentSearchColor:
+      return PlatformTextSearchHighlightColor(/* active_match */ true,
+                                              /* in_forced_colors */ false,
+                                              color_scheme, color_provider);
+    case CSSValueID::kInternalCurrentSearchTextColor:
+      return PlatformTextSearchColor(/* active_match */ true,
+                                     /* in_forced_colors */ false, color_scheme,
+                                     color_provider);
     default:
       break;
   }
@@ -740,7 +757,7 @@
           color_provider->GetColor(ui::kColorCssSystemWindowText);
       break;
     default:
-      return DefaultSystemColor(css_value_id, color_scheme);
+      return DefaultSystemColor(css_value_id, color_scheme, color_provider);
   }
 
   return Color::FromSkColor(system_theme_color);
diff --git a/third_party/blink/renderer/core/layout/layout_theme.h b/third_party/blink/renderer/core/layout/layout_theme.h
index 275aded..ee60e84 100644
--- a/third_party/blink/renderer/core/layout/layout_theme.h
+++ b/third_party/blink/renderer/core/layout/layout_theme.h
@@ -238,7 +238,8 @@
   Color GetCustomFocusRingColor() const;
 
   Color DefaultSystemColor(CSSValueID,
-                           mojom::blink::ColorScheme color_scheme) const;
+                           mojom::blink::ColorScheme color_scheme,
+                           const ui::ColorProvider* color_provider) const;
   Color SystemColorFromColorProvider(
       CSSValueID,
       mojom::blink::ColorScheme color_scheme,
diff --git a/third_party/blink/renderer/core/layout/layout_theme_android.cc b/third_party/blink/renderer/core/layout/layout_theme_android.cc
index 05f0d1b..1579a3e 100644
--- a/third_party/blink/renderer/core/layout/layout_theme_android.cc
+++ b/third_party/blink/renderer/core/layout/layout_theme_android.cc
@@ -28,7 +28,7 @@
   // DefaultSystemColor() for system colors.
   // TODO(crbug.com/40779801): This override can be removed if we can always
   // guarantee the provider is nullptr for Android.
-  return DefaultSystemColor(css_value_id, color_scheme);
+  return DefaultSystemColor(css_value_id, color_scheme, color_provider);
 }
 
 Color LayoutThemeAndroid::PlatformActiveSelectionBackgroundColor(
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc
index b2bc2a5..e0ffc0f 100644
--- a/third_party/blink/renderer/core/style/computed_style.cc
+++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -873,38 +873,27 @@
     diff.SetNeedsNormalPaintInvalidation();
   }
 
+  if (IsStackingContextWithoutContainment() !=
+      other.IsStackingContextWithoutContainment()) {
+    diff.SetNeedsFullLayout();
+    diff.SetNeedsNormalPaintInvalidation();
+  }
+
   if ((!diff.NeedsFullLayout() || !diff.NeedsNormalPaintInvalidation()) &&
       DiffNeedsFullLayoutAndPaintInvalidation(other, field_diff)) {
     diff.SetNeedsFullLayout();
     diff.SetNeedsNormalPaintInvalidation();
   }
 
-  if (field_diff & kLayout) {
+  if (!diff.NeedsFullLayout() &&
+      DiffNeedsFullLayout(document, other, field_diff)) {
     diff.SetNeedsFullLayout();
   }
 
-  if (!diff.NeedsFullLayout()) {
-    if (IsDisplayLayoutCustomBox() &&
-        DiffNeedsFullLayoutForLayoutCustom(document, other)) {
-      diff.SetNeedsFullLayout();
-    }
-    if (DisplayLayoutCustomParentName() &&
-        DiffNeedsFullLayoutForLayoutCustomChild(document, other)) {
-      diff.SetNeedsFullLayout();
-    }
-  }
-
-  if (HasOutOfFlowPosition()) {
-    if (!diff.NeedsLayout() && (field_diff & kOutOfFlow)) {
+  if (!diff.NeedsLayout()) {
+    if ((field_diff & kOutOfFlow) && HasOutOfFlowPosition()) {
       diff.SetNeedsPositionedMovementLayout();
-    }
-  } else {
-    // Inflow elements participate in margin-collapsing so need a full layout.
-    if (field_diff & kMargin) {
-      diff.SetNeedsFullLayout();
-    }
-
-    if (!diff.NeedsLayout() && HasInFlowPosition() && (field_diff & kInset)) {
+    } else if ((field_diff & kInset) && HasInFlowPosition()) {
       diff.SetNeedsPositionedMovementLayout();
     }
   }
@@ -1005,6 +994,39 @@
   return false;
 }
 
+bool ComputedStyle::DiffNeedsFullLayout(const Document& document,
+                                        const ComputedStyle& other,
+                                        uint32_t field_diff) const {
+  if (field_diff & kLayout) {
+    return true;
+  }
+
+  if (field_diff & kBorderWidth) {
+    if (BorderTopWidth() != other.BorderTopWidth() ||
+        BorderRightWidth() != other.BorderRightWidth() ||
+        BorderBottomWidth() != other.BorderBottomWidth() ||
+        BorderLeftWidth() != other.BorderLeftWidth()) {
+      return true;
+    }
+  }
+
+  if ((field_diff & kMargin) && !HasOutOfFlowPosition()) {
+    return true;
+  }
+
+  if (IsDisplayLayoutCustomBox() &&
+      DiffNeedsFullLayoutForLayoutCustom(document, other)) {
+    return true;
+  }
+
+  if (DisplayLayoutCustomParentName() &&
+      DiffNeedsFullLayoutForLayoutCustomChild(document, other)) {
+    return true;
+  }
+
+  return false;
+}
+
 bool ComputedStyle::DiffNeedsFullLayoutForLayoutCustom(
     const Document& document,
     const ComputedStyle& other) const {
@@ -1068,7 +1090,7 @@
     const Document& document,
     const ComputedStyle& other,
     uint32_t field_diff) const {
-  if (ComputedStyleBase::DiffNeedsPaintInvalidation(*this, other)) {
+  if (field_diff & kPaint) {
     return true;
   }
 
@@ -1085,6 +1107,10 @@
     return true;
   }
 
+  if (ComputedStyleBase::DiffNeedsPaintInvalidation(*this, other)) {
+    return true;
+  }
+
   if (!BorderVisuallyEqual(other)) {
     return true;
   }
@@ -1193,6 +1219,55 @@
              other);
 }
 
+bool ComputedStyle::DiffNeedsRecomputeVisualOverflow(
+    const ComputedStyle& other,
+    uint32_t field_diff) const {
+  if (field_diff & kVisualOverflow) {
+    return true;
+  }
+
+  if ((field_diff & kBorderImage) && !BorderVisualOverflowEqual(other)) {
+    return true;
+  }
+
+  if ((field_diff & kOutline) && !OutlineVisuallyEqual(other)) {
+    return true;
+  }
+
+  if ((field_diff & kTextDecoration) &&
+      TextDecorationVisualOverflowChanged(other)) {
+    return true;
+  }
+
+  return false;
+}
+
+bool ComputedStyle::DiffCompositingReasonsChanged(const ComputedStyle& other,
+                                                  uint32_t field_diff) const {
+  if (field_diff & kCompositing) {
+    return true;
+  }
+
+  if (UsedTransformStyle3D() != other.UsedTransformStyle3D()) {
+    return true;
+  }
+
+  if (ContainsPaint() != other.ContainsPaint()) {
+    return true;
+  }
+
+  if (IsOverflowVisibleAlongBothAxes() !=
+      other.IsOverflowVisibleAlongBothAxes()) {
+    return true;
+  }
+
+  if (PotentialCompositingReasonsFor3DTransformChanged(other)) {
+    return true;
+  }
+
+  return false;
+}
+
 void ComputedStyle::UpdatePropertySpecificDifferences(
     const ComputedStyle& other,
     uint32_t field_diff,
@@ -1219,12 +1294,7 @@
     diff.SetFilterChanged();
   }
 
-  if (ComputedStyleBase::
-          UpdatePropertySpecificDifferencesNeedsRecomputeVisualOverflow(
-              *this, other) ||
-      ((field_diff & kOutline) && !OutlineVisuallyEqual(other)) ||
-      ((field_diff & kTextDecoration) &&
-       TextDecorationVisualOverflowChanged(other))) {
+  if (DiffNeedsRecomputeVisualOverflow(other, field_diff)) {
     diff.SetNeedsRecomputeVisualOverflow();
   }
 
@@ -1249,24 +1319,7 @@
     diff.SetBlendModeChanged();
   }
 
-  if (HasCurrentTransformAnimation() != other.HasCurrentTransformAnimation() ||
-      HasCurrentScaleAnimation() != other.HasCurrentScaleAnimation() ||
-      HasCurrentRotateAnimation() != other.HasCurrentRotateAnimation() ||
-      HasCurrentTranslateAnimation() != other.HasCurrentTranslateAnimation() ||
-      HasCurrentOpacityAnimation() != other.HasCurrentOpacityAnimation() ||
-      HasCurrentFilterAnimation() != other.HasCurrentFilterAnimation() ||
-      HasCurrentBackdropFilterAnimation() !=
-          other.HasCurrentBackdropFilterAnimation() ||
-      SubtreeWillChangeContents() != other.SubtreeWillChangeContents() ||
-      WillChangeScrollPosition() != other.WillChangeScrollPosition() ||
-      WillChangeProperties() != other.WillChangeProperties() ||
-      BackfaceVisibility() != other.BackfaceVisibility() ||
-      UsedTransformStyle3D() != other.UsedTransformStyle3D() ||
-      ContainsPaint() != other.ContainsPaint() ||
-      IsOverflowVisibleAlongBothAxes() !=
-          other.IsOverflowVisibleAlongBothAxes() ||
-      BackdropFilter() != other.BackdropFilter() ||
-      PotentialCompositingReasonsFor3DTransformChanged(other)) {
+  if (DiffCompositingReasonsChanged(other, field_diff)) {
     diff.SetCompositingReasonsChanged();
   }
 }
@@ -1288,10 +1341,6 @@
   return false;
 }
 
-bool ComputedStyle::QuotesDataEquivalent(const ComputedStyle& other) const {
-  return base::ValuesEquivalent(Quotes(), other.Quotes());
-}
-
 static bool HasPropertyThatCreatesStackingContext(
     const Vector<CSSPropertyID>& properties) {
   for (CSSPropertyID property : properties) {
@@ -1828,10 +1877,6 @@
   }
 }
 
-bool ComputedStyle::TextShadowDataEquivalent(const ComputedStyle& other) const {
-  return base::ValuesEquivalent(TextShadow(), other.TextShadow());
-}
-
 bool ComputedStyle::CanRenderBorderImage() const {
   const StyleImage* border_image = BorderImage().GetImage();
   return border_image && border_image->CanRender() && border_image->IsLoaded();
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h
index 6f4f4fc..4e53f32 100644
--- a/third_party/blink/renderer/core/style/computed_style.h
+++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -484,11 +484,6 @@
    * class, and be kept to a minimum.
    */
 
-  // position-anchor
-  bool PositionAnchorDataEquivalent(const ComputedStyle& o) const {
-    return base::ValuesEquivalent(PositionAnchor(), o.PositionAnchor());
-  }
-
   // anchor-name
   bool AnchorNameDataEquivalent(const ComputedStyle& o) const {
     return base::ValuesEquivalent(AnchorName(), o.AnchorName());
@@ -587,11 +582,6 @@
     return BorderWidth(BorderRightStyle(), BorderRightWidthInternal());
   }
 
-  // box-shadow (aka -webkit-box-shadow)
-  bool BoxShadowDataEquivalent(const ComputedStyle& other) const {
-    return base::ValuesEquivalent(BoxShadow(), other.BoxShadow());
-  }
-
   // clip-path
   ClipPathOperation* ClipPath() const {
     // This method is accessed frequently during SVG Hit Testing, but the
@@ -631,25 +621,6 @@
   // Returns whether `line-clamp` or `-webkit-line-clamp` are set and apply.
   bool HasLineClamp() const { return LineClamp() != 0; }
 
-  bool OpacityChangedStackingContext(const ComputedStyle& other) const {
-    // We only need do layout for opacity changes if adding or losing opacity
-    // could trigger a change
-    // in us being a stacking context.
-    if (IsStackingContextWithoutContainment() ==
-            other.IsStackingContextWithoutContainment() ||
-        HasOpacity() == other.HasOpacity()) {
-      // FIXME: We would like to use SimplifiedLayout here, but we can't quite
-      // do that yet.  We need to make sure SimplifiedLayout can operate
-      // correctly on LayoutInlines (we will need to add a
-      // selfNeedsSimplifiedLayout bit in order to not get confused and taint
-      // every line).  In addition we need to solve the floating object issue
-      // when layers come and go. Right now a full layout is necessary to keep
-      // floating object lists sane.
-      return true;
-    }
-    return false;
-  }
-
   // Outline properties.
 
   bool OutlineVisuallyEqual(const ComputedStyle& other) const {
@@ -737,9 +708,6 @@
 
   // shape-outside (aka -webkit-shape-outside)
   ShapeValue* ShapeOutside() const { return ShapeOutsideInternal().Get(); }
-  bool ShapeOutsideDataEquivalent(const ComputedStyle& other) const {
-    return base::ValuesEquivalent(ShapeOutside(), other.ShapeOutside());
-  }
 
   // vertical-align
   EVerticalAlign VerticalAlign() const {
@@ -801,12 +769,6 @@
   // value is `outside`.
   bool MarkerShouldBeInside(const Element& parent) const;
 
-  // quotes
-  bool QuotesDataEquivalent(const ComputedStyle&) const;
-
-  // text-shadow
-  bool TextShadowDataEquivalent(const ComputedStyle&) const;
-
   // Text emphasis properties.
   TextEmphasisMark GetTextEmphasisMark() const;
   const AtomicString& TextEmphasisMarkString() const;
@@ -2503,6 +2465,9 @@
 
   bool DiffNeedsFullLayoutAndPaintInvalidation(const ComputedStyle& other,
                                                uint32_t field_diff) const;
+  bool DiffNeedsFullLayout(const Document&,
+                           const ComputedStyle& other,
+                           uint32_t field_diff) const;
   bool DiffNeedsFullLayoutForLayoutCustom(const Document&,
                                           const ComputedStyle& other) const;
   bool DiffNeedsFullLayoutForLayoutCustomChild(
@@ -2514,6 +2479,10 @@
   bool DiffNeedsPaintInvalidationForPaintImage(const StyleImage&,
                                                const ComputedStyle& other,
                                                const Document&) const;
+  bool DiffNeedsRecomputeVisualOverflow(const ComputedStyle& other,
+                                        uint32_t field_diff) const;
+  bool DiffCompositingReasonsChanged(const ComputedStyle& other,
+                                     uint32_t field_diff) const;
   void UpdatePropertySpecificDifferences(const ComputedStyle& other,
                                          uint32_t field_diff,
                                          StyleDifference&) const;
diff --git a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5 b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
index 04b72ee..405c7b8b 100644
--- a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
+++ b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
@@ -32,56 +32,8 @@
   data: [
     {
         name: "DiffNeedsFullLayoutAndPaintInvalidation",
-        fields_to_diff: ["padding-top", "padding-left", "padding-right",
-                "padding-bottom", "appearance", "-webkit-line-clamp",
-                "text-overflow", "shape-margin", "order",
-                "text-indent", "text-align-last", "EffectiveZoom",
-                "word-break", "overflow-wrap", "-webkit-line-break",
-                "-webkit-text-security",
-                "hyphens", "hyphenate-character", "hyphenate-limit-chars",
-                "image-orientation", "ruby-position",
-                "TextEmphasisMark", "TextEmphasisFill", "text-emphasis-position",
-                "TextEmphasisCustomMark", "text-orientation",
-                "text-combine-upright", "tab-size", "text-size-adjust",
-                "list-style-image",
-                "-webkit-text-stroke-width", "line-height",
-                "-webkit-border-horizontal-spacing",
-                "-webkit-border-vertical-spacing", "TextAutosizingMultiplier",
-                "grid-template-areas", "initial-letter",
-                "grid-auto-rows", "grid-template-rows", "grid-template-columns",
-                "grid-auto-columns", "row-gap", "grid-auto-flow",
-                "-webkit-box-flex", "-webkit-box-ordinal-group", "flex-basis",
-                "flex-shrink", "flex-grow", "flex-direction", "flex-wrap", "-webkit-box-align",
-                "-webkit-box-decoration-break", "-webkit-box-pack", "-webkit-box-orient",
-                "grid-row-start", "grid-row-end", "grid-column-start", "grid-column-end",
-                "column-gap", "column-width",
-                "column-count", "HasAutoColumnCount", "HasAutoColumnWidth", "column-fill", "column-span",
-                "MathFractionBarThickness", "MathLSpace", "MathMaxSize", "MathMinSize",
-                "MathPaddedVOffset", "MathRSpace",
-                "cx", "cy", "d", "rx", "ry", "x", "y", "r", "alignment-baseline", "vector-effect",
-                "BaselineShiftType", "baseline-shift", "dominant-baseline",
-                "CssDominantBaseline", "text-anchor",
-                "stroke-width", "stroke-miterlimit", "stroke-linecap", "stroke-linejoin",
-                "marker-end", "marker-mid", "marker-start", "scrollbar-width", "object-view-box",
-                "position-try-options", "position-try-order", "position-visibility", "inset-area"],
         methods_to_diff: [
           {
-            method: "BorderLeftWidth()",
-            field_dependencies: ["border-left-width"]
-          },
-          {
-            method: "BorderTopWidth()",
-            field_dependencies: ["border-top-width"]
-          },
-          {
-            method: "BorderBottomWidth()",
-            field_dependencies: ["border-bottom-width"]
-          },
-          {
-            method: "BorderRightWidth()",
-            field_dependencies: ["border-right-width"]
-          },
-          {
             method: "HasPseudoElementStyle(kPseudoIdScrollbar)",
             field_dependencies: ["StyleType"]
           },
@@ -90,50 +42,6 @@
             field_dependencies: ["StyleType"]
           },
           {
-            method: "BoxDirection()",
-            field_dependencies: ["-webkit-box-direction"]
-          },
-          {
-            method: "GetTextAlign()",
-            field_dependencies: ["text-align"]
-          },
-          {
-            method: "GetWritingMode()",
-            field_dependencies: ["writing-mode"]
-          },
-          {
-            method: "OverflowX()",
-            field_dependencies: ["overflow-x"]
-          },
-          {
-            method: "OverflowY()",
-            field_dependencies: ["overflow-y"]
-          },
-          {
-            method: "ScrollbarWidth()",
-            field_dependencies: ["scrollbar-width"]
-          },
-          {
-            method: "Clear()",
-            field_dependencies: ["clear"]
-          },
-          {
-            method: "Floating()",
-            field_dependencies: ["float"]
-          },
-          {
-            method: "Display()",
-            field_dependencies: ["Display"]
-          },
-          {
-            method: "DisplayLayoutCustomName()",
-            field_dependencies: ["DisplayLayoutCustomName"]
-          },
-          {
-            method: "IsOriginalDisplayInlineType()",
-            field_dependencies: ["IsOriginalDisplayInlineType"]
-          },
-          {
             method: "HasStroke()",
             field_dependencies: ["stroke"]
           },
@@ -141,61 +49,12 @@
             method: "HasDashArray()",
             field_dependencies: ["stroke-dasharray"]
           },
-          {
-            method: "UsedScrollbarWidth()",
-            field_dependencies: ["scrollbar-width"]
-          },
         ],
-        predicates_to_test: [
-          {
-            predicate: "a.TextShadowDataEquivalent(b)",
-            field_dependencies: ["text-shadow"]
-          },
-          {
-            predicate: "a.QuotesDataEquivalent(b)",
-            field_dependencies: ["quotes"]
-          },
-          {
-            predicate: "a.OpacityChangedStackingContext(b)",
-            field_dependencies: ["IsStackingContextWithoutContainment",
-                                 "opacity"]
-          },
-          {
-            predicate: "a.PositionAnchorDataEquivalent(b)",
-            field_dependencies: ["position-anchor"]
-          },
-        ]
     },
     {
         name: "DiffNeedsPaintInvalidation",
-        fields_to_diff: ["-webkit-user-modify", "user-select", "image-rendering",
-                "dynamic-range-limit", "column-rule-style", "column-rule-width",
-                "column-rule-color", "-internal-visited-column-rule-color",
-                "-webkit-user-drag", "object-fit", "object-position",
-                "mix-blend-mode", "isolation", "Mask", "MaskBoxImage", "mask-type",
-                "stop-color", "stop-opacity", "flood-color", "flood-opacity",
-                "lighting-color", "shape-rendering", "clip-rule", "fill-rule",
-                "color-interpolation", "color-interpolation-filters", "paint-order",
-                "fill", "fill-opacity", "stroke", "stroke-opacity",
-                "-internal-visited-stroke", "stroke-dashoffset", "ColorSchemeForced"],
         methods_to_diff: [
           {
-            method: "Visibility()",
-            field_dependencies: ["visibility"]
-          },
-          {
-            method: "PrintColorAdjust()",
-            field_dependencies: ["-webkit-print-color-adjust"]
-          },
-          {
-            method: "InsideLink()",
-            field_dependencies: ["InsideLink"]
-          },
-          {
-            method: "Resize()",
-            field_dependencies: ["resize"]
-          },
-          {
             method: "UsedColorScheme()",
             field_dependencies: ["color-scheme"]
           },
@@ -210,14 +69,6 @@
         ],
         predicates_to_test: [
           {
-            predicate: "a.BoxShadowDataEquivalent(b)",
-            field_dependencies: ["box-shadow"]
-          },
-          {
-            predicate: "a.ShapeOutsideDataEquivalent(b)",
-            field_dependencies: ["shape-outside"]
-          },
-          {
             predicate: "a.InternalVisitedBorderLeftColorHasNotChanged(b)",
             field_dependencies: ["-internal-visited-border-left-color"]
           },
@@ -272,18 +123,5 @@
           },
         ]
     },
-    {
-        name: "UpdatePropertySpecificDifferencesNeedsRecomputeVisualOverflow",
-        predicates_to_test: [
-          {
-            predicate: "a.BoxShadowDataEquivalent(b)",
-            field_dependencies: ["box-shadow"]
-          },
-          {
-            predicate: "a.BorderVisualOverflowEqual(b)",
-            field_dependencies: ["border-image"]
-          },
-        ]
-    },
   ],
 }
diff --git a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
index 2a506e6..72988d6 100644
--- a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
+++ b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
@@ -63,6 +63,7 @@
       type_name: "AtomicString",
       include_paths: ["third_party/blink/renderer/platform/wtf/text/atomic_string.h"],
       default_value: "g_null_atom",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "DisplayLayoutCustomParentName",
@@ -77,6 +78,7 @@
       field_template: "primitive",
       type_name: "bool",
       default_value: "true",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "InsideLink",
@@ -84,6 +86,7 @@
       default_value: "not-inside-link",
       keywords: ["not-inside-link", "inside-unvisited-link", "inside-visited-link"],
       inherited: true,
+      invalidate: ["paint"],
     },
     {
       name: "InForcedColorsMode",
@@ -329,6 +332,7 @@
       type_name: "NinePieceImage",
       field_group: "surround",
       default_value: "NinePieceImage()",
+      invalidate: ["border-image"],
     },
     {
       name: "Background",
@@ -381,6 +385,7 @@
       field_group: "inherited",
       default_value: "1.0",
       computed_style_custom_functions: ["setter"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "CursorData",
@@ -401,6 +406,7 @@
       default_value: "1.0f",
       field_group: "*",
       computed_style_custom_functions: ["setter"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "TextEmphasisFill",
@@ -410,6 +416,7 @@
       default_value: "filled",
       keywords: ["filled", "open"],
       field_group: "*",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "TextEmphasisMark",
@@ -420,6 +427,7 @@
       keywords: ["none", "auto", "dot", "circle", "double-circle", "triangle", "sesame", "custom"],
       field_group: "*",
       computed_style_custom_functions: ["getter"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "SubtreeWillChangeContents",
@@ -427,6 +435,7 @@
       type_name: "bool",
       default_value: "false",
       field_group: "*",
+      invalidate: ["compositing"],
     },
     // Though position: sticky is not itself an inherited property, being a
     // descendent of a sticky element changes some document lifecycle logic.
@@ -464,6 +473,7 @@
       include_paths: ["third_party/blink/renderer/platform/wtf/text/atomic_string.h"],
       default_value: "AtomicString()",
       field_group: "*",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "BaseTextDecorationData",
@@ -516,7 +526,7 @@
       field_group: "*",
       default_value: "FillLayer(EFillLayerType::kMask, true)",
       computed_style_custom_functions: ["initial", "getter", "setter"],
-      invalidate: ["mask"],
+      invalidate: ["mask", "paint"],
     },
     {
       name: "CounterDirectives",
@@ -556,7 +566,7 @@
       default_value: "NinePieceImage::MaskDefaults()",
       include_paths: ["third_party/blink/renderer/core/style/nine_piece_image.h"],
       computed_style_custom_functions: ["getter", "setter"],
-      invalidate: ["mask"],
+      invalidate: ["mask", "paint"],
     },
     {
       name: "PageSize",
@@ -633,6 +643,7 @@
       type_name: "bool",
       field_group: "*",
       default_value: "false",
+      invalidate: ["compositing"],
     },
     {
       name: "HasCurrentTranslateAnimation",
@@ -640,6 +651,7 @@
       type_name: "bool",
       field_group: "*",
       default_value: "false",
+      invalidate: ["compositing"],
     },
     {
       name: "HasCurrentRotateAnimation",
@@ -647,6 +659,7 @@
       type_name: "bool",
       field_group: "*",
       default_value: "false",
+      invalidate: ["compositing"],
     },
     {
       name: "HasCurrentScaleAnimation",
@@ -654,6 +667,7 @@
       type_name: "bool",
       field_group: "*",
       default_value: "false",
+      invalidate: ["compositing"],
     },
     {
       name: "HasCurrentTransformAnimation",
@@ -661,6 +675,7 @@
       type_name: "bool",
       field_group: "*",
       default_value: "false",
+      invalidate: ["compositing"],
     },
     {
       name: "HasCurrentFilterAnimation",
@@ -668,6 +683,7 @@
       type_name: "bool",
       field_group: "*",
       default_value: "false",
+      invalidate: ["compositing"],
     },
     {
       name: "HasCurrentBackdropFilterAnimation",
@@ -675,6 +691,7 @@
       type_name: "bool",
       field_group: "*",
       default_value: "false",
+      invalidate: ["compositing"],
     },
     {
       name: "HasCurrentBackgroundColorAnimation",
@@ -847,6 +864,7 @@
       default_value: "Vector<CSSPropertyID>()",
       include_paths: ["third_party/blink/renderer/platform/wtf/vector.h",
                       "third_party/blink/renderer/core/css/css_property_names.h"],
+      invalidate: ["compositing"],
     },
     {
       name: "WillChangeContents",
@@ -861,6 +879,7 @@
       type_name: "bool",
       field_group: "*->will-change",
       default_value: "false",
+      invalidate: ["compositing"],
     },
     {
       name: "HasAutoColumnWidth",
@@ -869,6 +888,7 @@
       field_group: "*",
       default_value: "true",
       computed_style_custom_functions: ["setter"],
+      invalidate: ["layout", "paint"],
     },
     {
       name: "HasAutoColumnCount",
@@ -877,6 +897,7 @@
       field_group: "*",
       default_value: "true",
       computed_style_custom_functions: ["setter"],
+      invalidate: ["layout", "paint"],
     },
     // We only create and store ComputedStyle objects for elements in
     // display:none subtrees if we need it for e.g. getComputedStyle. This flag
@@ -924,6 +945,7 @@
       default_value: "false",
       custom_compare: true,
       inherited: true,
+      invalidate: ["paint"],
     },
     {
       name: "IsInBlockifyingDisplay",
@@ -998,6 +1020,7 @@
       type_name: "Length",
       field_group: "*->math",
       getter: "GetMathFractionBarThickness",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "MathLSpace",
@@ -1007,6 +1030,7 @@
       type_name: "Length",
       field_group: "*->math",
       getter: "GetMathLSpace",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "MathRSpace",
@@ -1016,6 +1040,7 @@
       type_name: "Length",
       field_group: "*->math",
       getter: "GetMathRSpace",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "MathPaddedVOffset",
@@ -1025,6 +1050,7 @@
       type_name: "Length",
       field_group: "*->math",
       getter: "GetMathPaddedVOffset",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "MathPaddedDepth",
@@ -1043,6 +1069,7 @@
       type_name: "Length",
       field_group: "*->math",
       getter: "GetMathMinSize",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "MathMaxSize",
@@ -1052,6 +1079,7 @@
       type_name: "Length",
       field_group: "*->math",
       getter: "GetMathMaxSize",
+      invalidate: ["layout", "paint"],
     },
     {
       name: "EffectiveZIndexZero",
@@ -1068,6 +1096,7 @@
       field_size: 2,
       type_name: "EBaselineShiftType",
       default_value: "EBaselineShiftType::kLength",
+      invalidate: ["layout", "paint"],
     },
     {
       // Represents 'dominant-baseline' defined in the css-inline specification,
@@ -1082,6 +1111,7 @@
       type_name: "EDominantBaseline",
       default_value: "EDominantBaseline::kAuto",
       inherited: true,
+      invalidate: ["layout", "paint"],
     },
     {
       name: "DependsOnSizeContainerQueries",
@@ -1259,6 +1289,7 @@
       type_name: "bool",
       default_value: "false",
       inherited: true,
+      invalidate: ["layout", "paint"],
     },
   ],
 }
diff --git a/third_party/blink/renderer/core/style/style_highlight_data.cc b/third_party/blink/renderer/core/style/style_highlight_data.cc
index 6f80b69..6bc93bf 100644
--- a/third_party/blink/renderer/core/style/style_highlight_data.cc
+++ b/third_party/blink/renderer/core/style/style_highlight_data.cc
@@ -45,6 +45,9 @@
   switch (pseudo_id) {
     case kPseudoIdSelection:
       return Selection();
+    case kPseudoIdSearchText:
+      // For ::search-text:current, call SearchTextCurrent() directly.
+      return SearchTextNotCurrent();
     case kPseudoIdTargetText:
       return TargetText();
     case kPseudoIdSpellingError:
@@ -63,6 +66,14 @@
   return selection_.Get();
 }
 
+const ComputedStyle* StyleHighlightData::SearchTextCurrent() const {
+  return search_text_current_.Get();
+}
+
+const ComputedStyle* StyleHighlightData::SearchTextNotCurrent() const {
+  return search_text_not_current_.Get();
+}
+
 const ComputedStyle* StyleHighlightData::TargetText() const {
   return target_text_.Get();
 }
@@ -91,6 +102,14 @@
   selection_ = style;
 }
 
+void StyleHighlightData::SetSearchTextCurrent(const ComputedStyle* style) {
+  search_text_current_ = style;
+}
+
+void StyleHighlightData::SetSearchTextNotCurrent(const ComputedStyle* style) {
+  search_text_not_current_ = style;
+}
+
 void StyleHighlightData::SetTargetText(const ComputedStyle* style) {
   target_text_ = style;
 }
@@ -135,6 +154,8 @@
 
 void StyleHighlightData::Trace(Visitor* visitor) const {
   visitor->Trace(selection_);
+  visitor->Trace(search_text_current_);
+  visitor->Trace(search_text_not_current_);
   visitor->Trace(target_text_);
   visitor->Trace(spelling_error_);
   visitor->Trace(grammar_error_);
diff --git a/third_party/blink/renderer/core/style/style_highlight_data.h b/third_party/blink/renderer/core/style/style_highlight_data.h
index f4333c8..4dd91de 100644
--- a/third_party/blink/renderer/core/style/style_highlight_data.h
+++ b/third_party/blink/renderer/core/style/style_highlight_data.h
@@ -33,6 +33,8 @@
       PseudoId,
       const AtomicString& pseudo_argument = g_null_atom) const;
   const ComputedStyle* Selection() const;
+  const ComputedStyle* SearchTextCurrent() const;
+  const ComputedStyle* SearchTextNotCurrent() const;
   const ComputedStyle* TargetText() const;
   const ComputedStyle* SpellingError() const;
   const ComputedStyle* GrammarError() const;
@@ -41,6 +43,8 @@
     return custom_highlights_;
   }
   void SetSelection(const ComputedStyle*);
+  void SetSearchTextCurrent(const ComputedStyle*);
+  void SetSearchTextNotCurrent(const ComputedStyle*);
   void SetTargetText(const ComputedStyle*);
   void SetSpellingError(const ComputedStyle*);
   void SetGrammarError(const ComputedStyle*);
@@ -52,6 +56,8 @@
 
  private:
   Member<const ComputedStyle> selection_;
+  Member<const ComputedStyle> search_text_current_;
+  Member<const ComputedStyle> search_text_not_current_;
   Member<const ComputedStyle> target_text_;
   Member<const ComputedStyle> spelling_error_;
   Member<const ComputedStyle> grammar_error_;
diff --git a/third_party/blink/renderer/core/style/text_box_edge.h b/third_party/blink/renderer/core/style/text_box_edge.h
index 5fb6aec..7e32ad5 100644
--- a/third_party/blink/renderer/core/style/text_box_edge.h
+++ b/third_party/blink/renderer/core/style/text_box_edge.h
@@ -28,12 +28,29 @@
 
     // kIdeographic, not implemented.
     // kIdeographicInk, not implemented.
+
+    // When adding values, ensure the following constants and the `field_size`
+    // in `css_properties.json5` are in sync.
   };
 
-  TextBoxEdge() : TextBoxEdge(Type::kLeading, Type::kLeading) {}
-  explicit TextBoxEdge(Type over)
+  static constexpr unsigned kTypeBits = 3;
+  static constexpr unsigned kTypeMask = (1 << kTypeBits) - 1;
+  // The number of bits needed when storing `TextBoxEdge` as `unsigned`.
+  static constexpr unsigned kBits = kTypeBits * 2;
+
+  constexpr TextBoxEdge() : TextBoxEdge(Type::kLeading, Type::kLeading) {}
+  explicit constexpr TextBoxEdge(Type over)
       : TextBoxEdge(over, ComputeMissingUnderEdge(over)) {}
-  TextBoxEdge(Type over, Type under) : over_(over), under_(under) {}
+  constexpr TextBoxEdge(Type over, Type under) : over_(over), under_(under) {}
+
+  // Convert from/to `unsigned` to store in a bit field in `ComputedStyle`.
+  explicit constexpr TextBoxEdge(unsigned value)
+      : TextBoxEdge(static_cast<Type>(value & kTypeMask),
+                    static_cast<Type>((value >> kTypeBits) & kTypeMask)) {}
+  explicit constexpr operator unsigned() const {
+    return static_cast<unsigned>(over_) |
+           (static_cast<unsigned>(under_) << kTypeBits);
+  }
 
   bool operator==(const TextBoxEdge& other) const {
     return over_ == other.Over() && under_ == other.Under();
@@ -61,6 +78,9 @@
   Type under_;
 };
 
+// The initial value being 0 is preferred for performance reasons.
+static_assert(static_cast<unsigned>(TextBoxEdge()) == 0);
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_STYLE_TEXT_BOX_EDGE_H_
diff --git a/third_party/blink/renderer/modules/webgpu/external_texture_helper.cc b/third_party/blink/renderer/modules/webgpu/external_texture_helper.cc
index 26b5791..ad8aa53 100644
--- a/third_party/blink/renderer/modules/webgpu/external_texture_helper.cc
+++ b/third_party/blink/renderer/modules/webgpu/external_texture_helper.cc
@@ -39,6 +39,20 @@
   }
   NOTREACHED_IN_MIGRATION();
 }
+
+// TODO(crbug.com/40227105): Support HDR color space and color range in
+// generated wgsl shader to enable all color space for zero-copy path.
+bool DstColorSpaceSupportedByZeroCopy(
+    PredefinedColorSpace dst_predefined_color_space) {
+  switch (dst_predefined_color_space) {
+    case PredefinedColorSpace::kSRGB:
+    case PredefinedColorSpace::kP3:
+      return true;
+    default:
+      break;
+  }
+  return false;
+}
 }  // namespace
 
 std::array<float, 12> GetYUVToRGBMatrix(gfx::ColorSpace color_space,
@@ -193,11 +207,13 @@
 
 ExternalTexture CreateExternalTexture(
     GPUDevice* device,
-    gfx::ColorSpace src_color_space,
-    gfx::ColorSpace dst_color_space,
+    PredefinedColorSpace dst_predefined_color_space,
     scoped_refptr<media::VideoFrame> media_video_frame,
     media::PaintCanvasVideoRenderer* video_renderer) {
   DCHECK(media_video_frame);
+  gfx::ColorSpace src_color_space = media_video_frame->ColorSpace();
+  gfx::ColorSpace dst_color_space =
+      PredefinedColorSpaceToGfxColorSpace(dst_predefined_color_space);
 
   // It should be very rare that a frame didn't get a valid colorspace through
   // the guessing process:
@@ -245,7 +261,9 @@
       (media_video_frame->HasTextures() &&
        (media_video_frame->format() == media::PIXEL_FORMAT_NV12) &&
        device_support_zero_copy &&
-       media_video_frame->metadata().is_webgpu_compatible);
+       media_video_frame->metadata().is_webgpu_compatible &&
+       DstColorSpaceSupportedByZeroCopy(dst_predefined_color_space));
+
   TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webgpu"),
                        "CreateExternalTexture", TRACE_EVENT_SCOPE_THREAD,
                        "zero_copy", !!zero_copy, "video_frame",
diff --git a/third_party/blink/renderer/modules/webgpu/external_texture_helper.h b/third_party/blink/renderer/modules/webgpu/external_texture_helper.h
index 6203e21..bf1bccf 100644
--- a/third_party/blink/renderer/modules/webgpu/external_texture_helper.h
+++ b/third_party/blink/renderer/modules/webgpu/external_texture_helper.h
@@ -8,6 +8,7 @@
 #include "base/memory/raw_ptr.h"
 #include "media/base/video_frame.h"
 #include "third_party/blink/renderer/modules/webgpu/dawn_object.h"
+#include "third_party/blink/renderer/platform/graphics/graphics_types.h"
 
 namespace gfx {
 class ColorSpace;
@@ -64,8 +65,7 @@
 
 ExternalTexture CreateExternalTexture(
     GPUDevice* device,
-    gfx::ColorSpace src_color_space,
-    gfx::ColorSpace dst_color_space,
+    PredefinedColorSpace dst_predefined_color_space,
     scoped_refptr<media::VideoFrame> media_video_frame,
     media::PaintCanvasVideoRenderer* video_renderer);
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_external_texture.cc b/third_party/blink/renderer/modules/webgpu/gpu_external_texture.cc
index dd99dee3..0ed04cc3 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_external_texture.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_external_texture.cc
@@ -192,18 +192,6 @@
     ExceptionState& exception_state) {
   CHECK(media_video_frame);
 
-  switch (webgpu_desc->colorSpace().AsEnum()) {
-    case V8PredefinedColorSpace::Enum::kSRGB:
-    case V8PredefinedColorSpace::Enum::kDisplayP3:
-      break;
-    default:
-      exception_state.ThrowDOMException(
-          DOMExceptionCode::kOperationError,
-          "Requested colorSpace '" + webgpu_desc->colorSpace().AsString() +
-              "' is not implemented. Use 'srgb' or 'display-p3'.");
-      return nullptr;
-  }
-
   PredefinedColorSpace dst_predefined_color_space;
   if (!ValidateAndConvertColorSpace(webgpu_desc->colorSpace(),
                                     dst_predefined_color_space,
@@ -211,12 +199,9 @@
     return nullptr;
   }
 
-  gfx::ColorSpace dst_color_space =
-      PredefinedColorSpaceToGfxColorSpace(dst_predefined_color_space);
-
   ExternalTexture external_texture =
-      CreateExternalTexture(cache->device(), media_video_frame->ColorSpace(),
-                            dst_color_space, media_video_frame, video_renderer);
+      CreateExternalTexture(cache->device(), dst_predefined_color_space,
+                            media_video_frame, video_renderer);
 
   if (external_texture.wgpu_external_texture == nullptr ||
       external_texture.mailbox_texture == nullptr) {
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
index f720acb2..9e75a8c 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
@@ -736,15 +736,11 @@
     bool flipY) {
   CHECK(source.valid);
 
-  // Import GPUExternalTexture to sRGB color space always.
-  // Delegate future color space conversion for
-  // Dawn::CopyExternalTextureForBrowser.
-  gfx::ColorSpace external_texture_dst_color_space =
-      PredefinedColorSpaceToGfxColorSpace(dst_color_space);
+  // Create External Texture with dst color space. No color space conversion
+  // happens during copy step.
   ExternalTexture external_texture =
-      CreateExternalTexture(device_, source.media_video_frame->ColorSpace(),
-                            external_texture_dst_color_space,
-                            source.media_video_frame, source.video_renderer);
+      CreateExternalTexture(device_, dst_color_space, source.media_video_frame,
+                            source.video_renderer);
 
   wgpu::CopyTextureForBrowserOptions options = {
       // Extracting contents from HTMLVideoElement (e.g.
@@ -757,25 +753,6 @@
                           : wgpu::AlphaMode::Unpremultiplied,
   };
 
-  // Set color space conversion params
-  gfx::ColorSpace gfx_dst_color_space =
-      PredefinedColorSpaceToGfxColorSpace(dst_color_space);
-
-  ColorSpaceConversionConstants color_space_conversion_constants;
-
-  if (external_texture_dst_color_space != gfx_dst_color_space) {
-    color_space_conversion_constants = GetColorSpaceConversionConstants(
-        external_texture_dst_color_space, gfx_dst_color_space);
-
-    options.needsColorSpaceConversion = true;
-    options.srcTransferFunctionParameters =
-        color_space_conversion_constants.src_transfer_constants.data();
-    options.dstTransferFunctionParameters =
-        color_space_conversion_constants.dst_transfer_constants.data();
-    options.conversionMatrix =
-        color_space_conversion_constants.gamut_conversion_matrix.data();
-  }
-
   options.flipY = flipY;
 
   wgpu::ImageCopyExternalTexture src = {
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_queue.idl b/third_party/blink/renderer/modules/webgpu/gpu_queue.idl
index 85e2da2..ad9099a3 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_queue.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_queue.idl
@@ -12,9 +12,6 @@
 
     [CallWith=ScriptState] Promise<undefined> onSubmittedWorkDone();
 
-    // TODO(crbug.com/1088107): Merge these overloads into one with
-    // [AllowShared] BufferSource (or whatever the upstream spec has), which
-    // would expand this to allow SharedArrayBuffer (can't be implemented now).
     [CallWith=ScriptState, RaisesException] void writeBuffer(
         GPUBuffer buffer,
         GPUSize64 bufferOffset,
@@ -24,7 +21,7 @@
     [CallWith=ScriptState, RaisesException] void writeBuffer(
         GPUBuffer buffer,
         GPUSize64 bufferOffset,
-        ArrayBuffer data,
+        [AllowShared] ArrayBuffer data,
         optional GPUSize64 dataByteOffset = 0,
         optional GPUSize64 byteSize);
 
@@ -35,7 +32,7 @@
         GPUExtent3D size);
     [CallWith=ScriptState, RaisesException] void writeTexture(
         GPUImageCopyTexture destination,
-        ArrayBuffer data,
+        [AllowShared] ArrayBuffer data,
         GPUImageDataLayout dataLayout,
         GPUExtent3D size);
 
diff --git a/third_party/blink/renderer/platform/heap/test/incremental_marking_test.cc b/third_party/blink/renderer/platform/heap/test/incremental_marking_test.cc
index d4c2310..0ea01b56 100644
--- a/third_party/blink/renderer/platform/heap/test/incremental_marking_test.cc
+++ b/third_party/blink/renderer/platform/heap/test/incremental_marking_test.cc
@@ -1517,5 +1517,22 @@
   EXPECT_EQ(0u, DestructedAndTraced::n_destructed);
 }
 
+TEST_F(IncrementalMarkingTest, NestedVectorsWithInlineCapacityOnStack) {
+  // Regression test: https://crbug.com/339967265
+  //
+  // Regression test ensures that on-stack nested vectors do not have their
+  // backing slot registered for compaction. Registering the slot would result
+  // in a nullptr crash.
+  IncrementalMarkingTestDriver driver(ThreadState::Current());
+  CompactionTestDriver(ThreadState::Current()).ForceCompactionForNextGC();
+  // Pre-filled vector to trigger write barrier for backing below.
+  HeapVector<int> inner_vector({1});
+  driver.StartGC();
+  // Vector with inline capacity on stack.
+  HeapVector<HeapVector<int>, 1> vector;
+  vector.push_back(inner_vector);
+  driver.FinishGC();
+}
+
 }  // namespace incremental_marking_test
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 696ec8c4..f60c68a9 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -840,11 +840,6 @@
       status: "stable",
     },
     {
-      // crbug.com/1447058
-      name: "CssFieldSizing",
-      status: "stable",
-    },
-    {
       name: "CSSFirstLetterTextRewrite",
       status: "stable",
     },
@@ -2189,6 +2184,7 @@
       // keyboard focusable by default.
       name: "KeyboardFocusableScrollers",
       status: "experimental",
+      public: true,
     },
     {
       // TODO(crbug.com/40113891): Disables KeyboardFocusableScrollers.
@@ -2203,7 +2199,6 @@
       origin_trial_type: "deprecation",
       origin_trial_allows_insecure: true,
       origin_trial_allows_third_party: true,
-      public: true,
     },
     {
       // This feature makes HTMLLabelElement::DefaultEventHandler always call
@@ -3188,6 +3183,10 @@
       name: "ReadableStreamAsyncIterable",
       status: "stable",
     },
+    {
+      name: "RecollectInlinesReserveCapacity",
+      status: "stable",
+    },
     // If enabled, the Accept-Language header will be reduced.
     {
       name: "ReduceAcceptLanguage",
diff --git a/third_party/blink/renderer/platform/weborigin/security_origin_fuzzer.cc b/third_party/blink/renderer/platform/weborigin/security_origin_fuzzer.cc
index 157cc30..23e1f814 100644
--- a/third_party/blink/renderer/platform/weborigin/security_origin_fuzzer.cc
+++ b/third_party/blink/renderer/platform/weborigin/security_origin_fuzzer.cc
@@ -8,7 +8,7 @@
 //   is_asan = true
 //   is_ubsan_security = true
 //   is_debug = false
-//   use_goma = true
+//   use_remoteexec = true
 // Build:     # autoninja -C out/Fuzz blink_security_origin_fuzzer
 // Run:       # ./out/Fuzz/blink_security_origin_fuzzer
 //
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index eb55b561..08016212 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -1706,6 +1706,13 @@
     },
     {
         'paths': [
+            'third_party/blink/renderer/core/layout/layout_theme.cc',
+            'third_party/blink/renderer/core/layout/layout_theme.h',
+        ],
+        'allowed': ['ui::ColorProvider'],
+    },
+    {
+        'paths': [
             'third_party/blink/renderer/core/scroll/mac_scrollbar_animator_impl.h',
             'third_party/blink/renderer/core/scroll/mac_scrollbar_animator_impl.mm',
         ],
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index c6eb1d0..7861abe 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -3574,6 +3574,11 @@
 # User-Agent is not able to be set on XHR/fetch
 crbug.com/571722 external/wpt/xhr/preserve-ua-header-on-redirect.htm [ Failure ]
 
+# Disable temporarily for v8 roll.
+crbug.com/340592165 inspector-protocol/runtime/runtime-console-basic-functions-paused.js [ Failure ]
+crbug.com/340592165 inspector-protocol/runtime/runtime-console-basic-functions.js [ Failure ]
+crbug.com/340592165 inspector-protocol/runtime/runtime-install-binding.js [ Failure ]
+
 # 1) V8 code cache doesn't support host defined options. When V8 code cache is
 # disabled, the subtest will pass. 2) Module cases always fail.
 crbug.com/1244145 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.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 729b53e..cb913d04 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
@@ -236620,6 +236620,19 @@
        {}
       ]
      ],
+     "sibling-frames-transition.html": [
+      "b4814c5ca81b768e73971ba7c1c858ac8b65c41f",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/sibling-frames-transition-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "snapshot-containing-block-absolute.html": [
       "91b71f7eec99096a7f9ce7615f418634728cee5f",
       [
@@ -293005,6 +293018,10 @@
      []
     ],
     "resources": {
+     "2x3-svg-scaled-by-sec-ch-width.py": [
+      "d53574c361213ddf0949f906a08ebe388f9aa2d0",
+      []
+     ],
      "accept-ch-different.html": [
       "05cc0b61b07c36fca5816e277df1dc98e70d9ba1",
       []
@@ -342685,6 +342702,10 @@
       "cce8d5eec38f1889c8a4e793015ea15c778a6774",
       []
      ],
+     "sibling-frames-transition-ref.html": [
+      "437c730b9e9416e26995f929cef856c2386c57db",
+      []
+     ],
      "snapshot-containing-block-absolute-ref.html": [
       "5f2e780c58f488d924b3043519c9711143de64e7",
       []
@@ -348734,7 +348755,7 @@
       []
      ],
      "reverting.md": [
-      "d374f0558e3e3d539d47c3d5373986838ffdf6e1",
+      "a45b86a969cfebec875cac51fd2ca201a726f26c",
       []
      ]
     },
@@ -352436,7 +352457,7 @@
       []
      ],
      "playback-temporary-events.js": [
-      "28f45222cfa1bb108cfc18dc9b4a37e4aaf5aaa0",
+      "d8dac4463df42bde9cc57745f822b95b5ef7d583",
       []
      ],
      "playback-temporary-expired.js": [
@@ -379236,7 +379257,7 @@
     ]
    },
    "lint.ignore": [
-    "fdcd6be19dd7281d4ae5d32a38cc48d6ef43b3db",
+    "9d846b35194d4163398690f5f605c1273b381064",
     []
    ],
    "loading": {
@@ -428326,6 +428347,13 @@
       {}
      ]
     ],
+    "sec-ch-width.https.html": [
+     "28fe0860545d4f1f69908575a023ea7b540c83dd",
+     [
+      null,
+      {}
+     ]
+    ],
     "service-workers": {
      "intercept-request-critical.https.window.js": [
       "079b9fd9ba07819c3c670588d25197a1e7527390",
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-float-start-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-float-start-001-ref.html
new file mode 100644
index 0000000..1b1941c9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-float-start-001-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+.float {
+  float: left;
+  width: 100px;
+  height: 50px;
+  background: blue;
+}
+.text {
+  margin-top: 100px;
+  font-family: Ahem;
+  font-size: 50px;
+  line-height: 1;
+}
+</style>
+<div>
+  <div class="float"></div>
+  <div class="text">A</div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-float-start-001.html b/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-float-start-001.html
new file mode 100644
index 0000000..99e4736ba
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-float-start-001.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>Tests BFC resolves at the box trimmed by `text-box-trim`.</title>
+<link rel="help" href="https://drafts.csswg.org/css-inline-3/#propdef-text-box-edge">
+<link rel="help" href="https://drafts.csswg.org/css-inline-3/#propdef-text-box-trim">
+<link rel="match" href="text-box-trim-float-start-001-ref.html">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+.float {
+  float: left;
+  width: 100px;
+  height: 50px;
+  background: blue;
+}
+.text {
+  margin-top: 100px;
+  font-family: Ahem;
+  font-size: 50px;
+  line-height: 3;
+  text-box-trim: start;
+  text-box-edge: text;
+}
+</style>
+<div>
+  <div class="float"></div>
+  <div class="text">A</div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-ruby-start-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-ruby-start-001-ref.html
new file mode 100644
index 0000000..390dbc7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-ruby-start-001-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+.spacer {
+  height: 40px;
+  background: lightgray;
+}
+.target {
+  font-family: Ahem;
+  font-size: 40px;
+  line-height: 1;
+}
+</style>
+<div class="spacer"></div>
+<div class="target">A BASE B</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-ruby-start-001.html b/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-ruby-start-001.html
new file mode 100644
index 0000000..25760123
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/text-box-trim/text-box-trim-ruby-start-001.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-inline-3/#propdef-text-box-edge">
+<link rel="help" href="https://drafts.csswg.org/css-inline-3/#propdef-text-box-trim">
+<link rel="match" href="text-box-trim-ruby-start-001-ref.html">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+.spacer {
+  height: 40px;
+  background: lightgray;
+}
+.target {
+  font-family: Ahem;
+  font-size: 40px;
+  line-height: 1;
+  text-box-trim: start;
+  text-box-edge: text;
+}
+rt {
+  /* The Ruby annotation positioning is UA-dependent. In order to ref-test the
+     trimming of parts above the ascent, hide the Ruby annotation. */
+  color: transparent;
+}
+</style>
+<div class="spacer"></div>
+<div class="target">A <ruby>BASE<rt>RUBY</rt></ruby> B</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-cascade/highlight-pseudos-computed-001.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-cascade/highlight-pseudos-computed-001.tentative.html
new file mode 100644
index 0000000..752af0b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-cascade/highlight-pseudos-computed-001.tentative.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Pseudo-Elements Test: highlight selectors getComputedStyle</title>
+<link rel="author" name="Delan Azabani" href="mailto:dazabani@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-pseudo/#highlight-selectors">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  #target::search-text {
+    background-color: blue;
+    color: lime;
+  }
+  #target::search-text:not(:current) {
+    background-color: green;
+  }
+  #target::search-text:current {
+    /* FAIL if this matches */
+    background-color: red;
+  }
+</style>
+<div id="target"></div>
+<script>
+  for (const pseudo of ["::search-text"]) {
+    test(() => {
+      let style = getComputedStyle(target, pseudo);
+      assert_equals(style.backgroundColor, "rgb(0, 128, 0)", "Background color is green.");
+      assert_equals(style.color, "rgb(0, 255, 0)", "Color is lime.");
+    }, `getComputedStyle() for ${pseudo}`);
+
+    for (illFormedPseudo of [`${pseudo}:`, `${pseudo})`, `${pseudo}(`, `${pseudo}(foo)`, `${pseudo}()`, `:${pseudo}`, `${pseudo}.`]) {
+      test(() => {
+        let style = getComputedStyle(target, illFormedPseudo);
+        let defaultStyle = getComputedStyle(target);
+        assert_equals(style.backgroundColor, "");
+        assert_equals(style.color,  "");
+      }, `getComputedStyle() for ${illFormedPseudo} should return an empty CSSStyleDeclaration`);
+    }
+  }
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/docs/reviewing-tests/reverting.md b/third_party/blink/web_tests/external/wpt/docs/reviewing-tests/reverting.md
index d374f05..a45b86a 100644
--- a/third_party/blink/web_tests/external/wpt/docs/reviewing-tests/reverting.md
+++ b/third_party/blink/web_tests/external/wpt/docs/reviewing-tests/reverting.md
@@ -3,7 +3,7 @@
 Testing is imperfect and from time to time changes are merged into master which
 break things for users of web-platform-tests. Such breakage can include:
 
-  * Failures in Travis or Taskcluster runs for this repository, either on the
+  * Failures in CI runs for this repository, either on the
     master branch or on pull requests following the breaking change.
 
   * Breakage in browser engine repositories which import and run
diff --git a/third_party/blink/web_tests/external/wpt/encrypted-media/scripts/playback-temporary-events.js b/third_party/blink/web_tests/external/wpt/encrypted-media/scripts/playback-temporary-events.js
index 28f45222..d8dac44 100644
--- a/third_party/blink/web_tests/external/wpt/encrypted-media/scripts/playback-temporary-events.js
+++ b/third_party/blink/web_tests/external/wpt/encrypted-media/scripts/playback-temporary-events.js
@@ -15,6 +15,7 @@
             _mediaKeys,
             _mediaKeySession,
             _mediaSource,
+            _resolvedClosePromises = 0,
             _timeupdateEvent = false,
             _events = [ ];
 
@@ -75,29 +76,42 @@
             }).catch(onFailure);
         }
 
-        function onClosed(event) {
-            _events.push('closed-attribute-resolved');
+        function onAllClosed() {
             setTimeout(test.step_func(function() {
                 checkEventSequence( _events,
                                     ['generaterequest',
                                         ['license-request', 'license-request-response', 'update-resolved'], // potentially repeating
                                         'allkeysusable',
                                         'playing',
-                                        'closed-attribute-resolved',
-                                        'close-promise-resolved',
+                                        'closed-promise-0',
+                                        'closed-promise-1',
                                         'emptykeyslist']);
                 test.done();
             } ), 0);
         }
 
+        function onClosed() {
+            // The two closed Promises are equivalent in every way.  The order between them does not matter.
+            // But both should be resolved at the right time relative to the other events.
+            // We generate numbered events for them (e.g. 'closed-promise-0') so they can both be placed in
+            // the overall timeline, but we don't care which is which.
+            _events.push('closed-promise-' + _resolvedClosePromises);
+            _resolvedClosePromises++;
+        }
+
         function onTimeupdate(event) {
             if (_video.currentTime > (config.duration || 1) && !_timeupdateEvent) {
                 _timeupdateEvent = true;
                 _video.pause();
 
-                _mediaKeySession.closed.then(test.step_func(onClosed));
-                _mediaKeySession.close().then(function() {
-                    _events.push('close-promise-resolved');
+                var closedAttributePromise = _mediaKeySession.closed;
+                var closeMethodPromise = _mediaKeySession.close();
+
+                closedAttributePromise.then(onClosed);
+                closeMethodPromise.then(onClosed);
+
+                Promise.all([ closedAttributePromise, closeMethodPromise ]).then(function() {
+                    test.step_func(onAllClosed);
                 }).catch(onFailure);
             }
         }
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addFrame.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addFrame.window.js
new file mode 100644
index 0000000..4c3c2ee
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addFrame.window.js
@@ -0,0 +1,40 @@
+// META: title=RemoteContextWrapper addFrame
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+// This tests that arguments passed to the constructor are respected.
+promise_test(async t => {
+  // Precondition: Test was loaded from the HTTP_ORIGIN.
+  assert_equals(
+      location.origin, get_host_info()['HTTP_ORIGIN'],
+      'test window was loaded on HTTP_ORIGIN');
+
+  const rcHelper = new RemoteContextHelper();
+
+  const main = await rcHelper.addWindow();
+
+  const headerName = 'x-wpt-test-header';
+  const headerValue = 'test-escaping()';
+  const frame = await main.addFrame(
+      /*extraConfig=*/ {
+        origin: 'HTTP_REMOTE_ORIGIN',
+        scripts: ['/common/get-host-info.sub.js', './resources/test-script.js'],
+        headers: [[headerName, headerValue]],
+      },
+      /*attributes=*/ {id: 'test-id'},
+  );
+
+  await assertSimplestScriptRuns(frame);
+  await assertFunctionRuns(frame, () => testFunction(), 'testFunction exists');
+  await assertOriginIsAsExpected(frame, get_host_info()['HTTP_REMOTE_ORIGIN']);
+  await assertHeaderIsAsExpected(frame, headerName, headerValue);
+
+  assert_equals(
+      await main.executeScript(() => document.getElementById('test-id').id),
+      'test-id', 'verify id');
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-window.js
index 54df673..fd747110 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-window.js
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-window.js
@@ -65,3 +65,16 @@
     eval(fnString).apply(null, args);
   });
 }
+
+// If a frameset element exists in the document, return the first one. Otherwise
+// create a new one and return that.
+function findOrCreateFrameset() {
+  const framesets = document.getElementsByTagName('frameset');
+  if (framesets.length > 0) {
+    return framesets[0];
+  }
+  const frameset = document.createElement('frameset');
+  frameset.cols = '100%';
+  document.body.append(frameset);
+  return frameset;
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
index aa24b36e8..6c66050 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
@@ -294,7 +294,8 @@
           el.setAttribute(attribute, attributes[attribute]);
         }
         el.src = url;
-        document.body.appendChild(el);
+        const parent = elementName == "frame" ? findOrCreateFrameset() : document.body;
+        parent.appendChild(el);
       }, [url, elementName, attributes]);
     };
   }
@@ -381,7 +382,7 @@
     }
 
     /**
-     * Adds an iframe with `src` attribute to the current document.
+     * Adds an `iframe` with `src` attribute to the current document.
      * @param {RemoteContextConfig} [extraConfig]
      * @param {[string, string][]} [attributes] A list of pairs of strings
      *     of attribute name and value these will be set on the iframe element
@@ -396,6 +397,21 @@
     }
 
     /**
+     * Adds a `frame` with `src` attribute to the current document's first
+     * `frameset` element.
+     * @param {RemoteContextConfig} [extraConfig]
+     * @param {[string, string][]} [attributes] A list of pairs of strings
+     *     of attribute name and value these will be set on the iframe element
+     *     when added to the document.
+     * @returns {Promise<RemoteContextWrapper>} The remote context.
+     */
+    addFrame(extraConfig, attributes = {}) {
+      return this.helper.createContext({
+        executorCreator: elementExecutorCreator(this, 'frame', attributes),
+        extraConfig,
+      });
+    }
+    /**
      * Adds an iframe with `srcdoc` attribute to the current document
      * @param {RemoteContextConfig} [extraConfig]
      * @param {[string, string][]} [attributes] A list of pairs of strings
diff --git a/third_party/chromium-variations b/third_party/chromium-variations
index b09e04b..400b0ab 160000
--- a/third_party/chromium-variations
+++ b/third_party/chromium-variations
@@ -1 +1 @@
-Subproject commit b09e04bd3002f6758419a23c3e057a8ef8a65dd7
+Subproject commit 400b0ab61345c1de3f4cc5d819928d43e4c695a7
diff --git a/third_party/cros_system_api b/third_party/cros_system_api
index 8d58ca6..6d8c1b4 160000
--- a/third_party/cros_system_api
+++ b/third_party/cros_system_api
@@ -1 +1 @@
-Subproject commit 8d58ca6b357e6827660dc26ca777c798f4426c2e
+Subproject commit 6d8c1b4587f6081e2fa963647a34385cb5e712b3
diff --git a/third_party/dawn b/third_party/dawn
index fda42b9..a4e7c43 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit fda42b9b030a9da4a3f3b3dc994bdba9eeb36b38
+Subproject commit a4e7c436a37a648de5396a7f8f6b6e4ecefcd9dd
diff --git a/third_party/depot_tools b/third_party/depot_tools
index 6421eb2..2b6524b 160000
--- a/third_party/depot_tools
+++ b/third_party/depot_tools
@@ -1 +1 @@
-Subproject commit 6421eb2eda04c003d77d26b1160082dcd6d249eb
+Subproject commit 2b6524b2085a41a4a0988d6e6e9c2f276ec83387
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal
index f29c0ec..14ec294 160000
--- a/third_party/devtools-frontend-internal
+++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@
-Subproject commit f29c0ec1aec9add36396f745cc2772f5a991ad4b
+Subproject commit 14ec2945940ec5f371f74442e9fafdbeaaf9a8c9
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index f7b7071..dfaca3a 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit f7b7071afe6e3177e406109af3e0831943c7fd1f
+Subproject commit dfaca3a03a86d3e30516ced2e537ad2e604e9bae
diff --git a/third_party/openscreen/src b/third_party/openscreen/src
index fdc8b9d..84fbee0 160000
--- a/third_party/openscreen/src
+++ b/third_party/openscreen/src
@@ -1 +1 @@
-Subproject commit fdc8b9d28b02fe63c98dccb065bcb7de89fa90fc
+Subproject commit 84fbee0809f2264218383b71a063300ea048c234
diff --git a/third_party/skia b/third_party/skia
index d0d87c2..c0caf10 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit d0d87c26b4899728b6e344d68843cae9f8c86c18
+Subproject commit c0caf10486cef54391b302b6f8a797a1dd718dbb
diff --git a/third_party/webrtc b/third_party/webrtc
index 7eff7e6..f80bea1 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 7eff7e6d83a77bcb940d0b6fb5d2697010e82b3b
+Subproject commit f80bea13b5b06b1e0734a5189992f79fc2dada8a
diff --git a/tools/clang/rewrite_raw_ptr_fields/rewrite-multiple-platforms.sh b/tools/clang/rewrite_raw_ptr_fields/rewrite-multiple-platforms.sh
index fe62b8d4..9fee683 100755
--- a/tools/clang/rewrite_raw_ptr_fields/rewrite-multiple-platforms.sh
+++ b/tools/clang/rewrite_raw_ptr_fields/rewrite-multiple-platforms.sh
@@ -46,7 +46,7 @@
 dcheck_always_on = true
 is_official_build = true
 symbol_level = 1
-use_goma = false
+use_remoteexec = false
 enable_remoting = true
 ffmpeg_branding = "Chrome"
 proprietary_codecs = true
@@ -64,7 +64,7 @@
 dcheck_always_on = true
 is_official_build = true
 symbol_level = 1
-use_goma = false
+use_remoteexec = false
 chrome_pgo_phase = 0
 force_enable_raw_ptr_exclusion = true
 EOF
@@ -77,7 +77,7 @@
 is_chrome_branded = true
 is_debug = false
 is_official_build = true
-use_goma = false
+use_remoteexec = false
 chrome_pgo_phase = 0
 force_enable_raw_ptr_exclusion = true
 EOF
@@ -91,7 +91,7 @@
 is_chrome_branded = true
 is_debug = false
 is_official_build = true
-use_goma = false
+use_remoteexec = false
 chrome_pgo_phase = 0
 force_enable_raw_ptr_exclusion = true
 EOF
@@ -105,7 +105,7 @@
 is_chrome_branded = true
 is_debug = false
 is_official_build = true
-use_goma = false
+use_remoteexec = false
 chrome_pgo_phase = 0
 force_enable_raw_ptr_exclusion = true
 EOF
@@ -118,7 +118,7 @@
 is_chrome_branded = true
 is_debug = false
 is_official_build = true
-use_goma = false
+use_remoteexec = false
 chrome_pgo_phase = 0
 symbol_level = 1
 force_enable_raw_ptr_exclusion = true
diff --git a/tools/clang/rewrite_raw_ptr_fields/rewrite.sh b/tools/clang/rewrite_raw_ptr_fields/rewrite.sh
index 0ba1893..bacc9f02 100755
--- a/tools/clang/rewrite_raw_ptr_fields/rewrite.sh
+++ b/tools/clang/rewrite_raw_ptr_fields/rewrite.sh
@@ -6,7 +6,7 @@
 # IMPORTANT! Before running this script you have to perform these steps:
 # 1. Run `mkdir ~/scratch`
 # 2. Run `gn args out/{your_out_dir}` and set the following options:
-#   use_goma = false
+#   use_remoteexec = false
 #   # this can be skipped if you do this in build/config/clang/clang.gni
 #   clang_use_chrome_plugins = false
 #
diff --git a/tools/clang/rewrite_templated_container_fields/rewrite-multiple-platforms.sh b/tools/clang/rewrite_templated_container_fields/rewrite-multiple-platforms.sh
index 92f36ec..970a29d 100755
--- a/tools/clang/rewrite_templated_container_fields/rewrite-multiple-platforms.sh
+++ b/tools/clang/rewrite_templated_container_fields/rewrite-multiple-platforms.sh
@@ -45,7 +45,7 @@
 dcheck_always_on = true
 is_official_build = true
 symbol_level = 1
-use_goma = false
+use_remoteexec = false
 enable_remoting = true
 enable_webview_bundles = true
 ffmpeg_branding = "Chrome"
@@ -64,7 +64,7 @@
 dcheck_always_on = true
 is_official_build = true
 symbol_level = 1
-use_goma = false
+use_remoteexec = false
 chrome_pgo_phase = 0
 force_enable_raw_ptr_exclusion = true
 EOF
@@ -77,7 +77,7 @@
 is_chrome_branded = true
 is_debug = false
 is_official_build = true
-use_goma = false
+use_remoteexec = false
 chrome_pgo_phase = 0
 force_enable_raw_ptr_exclusion = true
 EOF
@@ -91,7 +91,7 @@
 is_chrome_branded = true
 is_debug = false
 is_official_build = true
-use_goma = false
+use_remoteexec = false
 chrome_pgo_phase = 0
 force_enable_raw_ptr_exclusion = true
 EOF
@@ -103,7 +103,7 @@
 dcheck_always_on = true
 is_debug = false
 is_official_build = true
-use_goma = false
+use_remoteexec = false
 chrome_pgo_phase = 0
 force_enable_raw_ptr_exclusion = true
 EOF
@@ -116,7 +116,7 @@
 is_chrome_branded = true
 is_debug = false
 is_official_build = true
-use_goma = false
+use_remoteexec = false
 chrome_pgo_phase = 0
 symbol_level = 1
 force_enable_raw_ptr_exclusion = true
diff --git a/tools/clang/rewrite_templated_container_fields/rewrite.sh b/tools/clang/rewrite_templated_container_fields/rewrite.sh
index ccf66e42..73aa15a8 100755
--- a/tools/clang/rewrite_templated_container_fields/rewrite.sh
+++ b/tools/clang/rewrite_templated_container_fields/rewrite.sh
@@ -6,7 +6,7 @@
 # IMPORTANT! Before running this script you have to perform these steps:
 # 1. Run `mkdir ~/scratch`
 # 2. Run `gn args out/{your_out_dir}` and set the following options:
-#   use_goma = false
+#   use_remoteexec = false
 #   # this can be skipped if you do this in build/config/clang/clang.gni
 #   clang_use_chrome_plugins = false
 #
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 73c7ca54..f6523ba7 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -5653,6 +5653,8 @@
   <int value="15" label="kSystemAPICallError"/>
   <int value="16" label="kInvalidInputFrame"/>
   <int value="17" label="kInvalidOutputBuffer"/>
+  <int value="18" label="kPostBitstreamConversionError"/>
+  <int value="19" label="kOutOfMemoryError"/>
 </enum>
 
 <enum name="EncryptionScheme">
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index 91346c8..9f62cbb 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -5684,6 +5684,22 @@
   <token key="ConsentAlreadyGiven" variants="Vcn3ds.ConsentAlreadyGiven"/>
 </histogram>
 
+<histogram name="Autofill.Vcn3ds.Latency.{Result}" units="ms"
+    expires_after="2024-07-01">
+  <owner>vinnypersky@google.com</owner>
+  <owner>payments-autofill-team@google.com</owner>
+  <summary>
+    Logs the latency of the VCN 3DS authentication, from the time the pop-up was
+    shown to the time the pop-up was closed. Logged when the pop-up closes due
+    to the user completing the authentication successfully or unsuccessfully.
+    Not logged when the user manually closes the pop-up.
+  </summary>
+  <token key="Result">
+    <variant name="Failure"/>
+    <variant name="Success"/>
+  </token>
+</histogram>
+
 <histogram name="Autofill.Vcn3ds.PaymentsWindowUserConsentDialogResult"
     enum="PaymentsWindowUserConsentDialogResult" expires_after="2024-07-01">
   <owner>vinnypersky@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/enums.xml b/tools/metrics/histograms/metadata/enterprise/enums.xml
index ce622ead..cdee2c27 100644
--- a/tools/metrics/histograms/metadata/enterprise/enums.xml
+++ b/tools/metrics/histograms/metadata/enterprise/enums.xml
@@ -2134,6 +2134,7 @@
   <int value="1255" label="ContextualGoogleIntegrationsConfiguration"/>
   <int value="1256" label="PdfViewerOutOfProcessIframeEnabled"/>
   <int value="1257" label="LockScreenAutoStartOnlineReauth"/>
+  <int value="1258" label="KeyboardFocusableScrollersEnabled"/>
 </enum>
 
 <enum name="EnterprisePoliciesSources">
diff --git a/tools/metrics/histograms/metadata/file/enums.xml b/tools/metrics/histograms/metadata/file/enums.xml
index 134fb3b..475131e 100644
--- a/tools/metrics/histograms/metadata/file/enums.xml
+++ b/tools/metrics/histograms/metadata/file/enums.xml
@@ -443,6 +443,7 @@
   <int value="40" label="THROTTLING_APPLICATION"/>
   <int value="41" label="THROTTLING_UNKNOWN"/>
   <int value="42" label="FROZEN_ACCOUNT"/>
+  <int value="43" label="HTTP_PRECONDITION_FAILED"/>
 </enum>
 
 <enum name="FileSystemProviderMountType">
@@ -581,7 +582,7 @@
 
 <enum name="OfficeFilesSourceVolume">
   <int value="0" label="Google Drive"/>
-  <int value="1" label="My Files"/>
+  <int value="1" label="This Chromebook"/>
   <int value="2" label="Removable Disk"/>
   <int value="3" label="Archive File"/>
   <int value="4" label="FileSystemProvider API"/>
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml
index dcd4146..85c0506 100644
--- a/tools/metrics/histograms/metadata/file/histograms.xml
+++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -398,9 +398,9 @@
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
-    The size of the space consumed by a users files in &quot;My Files&quot;
-    folder and it's children, calculated as a percentage of the total disk
-    space. Calculated on user login and recorded by VolumeManager.
+    The size of the space consumed by a user's files in the 'MyFiles' folder and
+    its children, calculated as a percentage of the total disk space. Calculated
+    on user login and recorded by VolumeManager.
   </summary>
 </histogram>
 
@@ -409,9 +409,8 @@
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
-    The total size of all of the users files stored in the &quot;My Files&quot;
-    folder and it's children. Calculated on user login and recorded by
-    VolumeManager.
+    The total size of all of the user's files stored in the 'MyFiles' folder and
+    its children. Calculated on user login and recorded by VolumeManager.
   </summary>
 </histogram>
 
@@ -1815,8 +1814,7 @@
     <variant name="Drive"
         summary="The archive to mount is located under the Drive root"/>
     <variant name="MyFiles"
-        summary="The archive to mount is a local archive, located under the
-                 My files or the Downloads root"/>
+        summary="The archive to mount is a local file in 'MyFiles'"/>
     <variant name="Other"/>
   </token>
 </histogram>
diff --git a/tools/metrics/histograms/metadata/others/enums.xml b/tools/metrics/histograms/metadata/others/enums.xml
index 04968a6..f30379a 100644
--- a/tools/metrics/histograms/metadata/others/enums.xml
+++ b/tools/metrics/histograms/metadata/others/enums.xml
@@ -54,7 +54,6 @@
   <int value="7" label="Error: Screenshot creation failed"/>
   <int value="8" label="Error: Screenshot encoding failed"/>
   <int value="9" label="Escape key press"/>
-  <int value="10" label="Unexpected side panel open"/>
 </enum>
 
 <!-- LINT.ThenChange(//chrome/browser/ui/lens/lens_overlay_controller.h:DismissalSource) -->
diff --git a/tools/metrics/histograms/metadata/sync/enums.xml b/tools/metrics/histograms/metadata/sync/enums.xml
index 6976c62c4..f5d5757b 100644
--- a/tools/metrics/histograms/metadata/sync/enums.xml
+++ b/tools/metrics/histograms/metadata/sync/enums.xml
@@ -1032,12 +1032,17 @@
   <int value="0" label="Shutdown"/>
   <int value="1" label="Unrecoverable error"/>
   <int value="2" label="Disabled account"/>
-  <int value="3" label="Requested pref change"/>
+  <int value="3"
+      label="(Obsolete) Requested pref change. Removed 04/2024 (and not used
+             for some time before that)"/>
   <int value="4" label="Stop and clear"/>
   <int value="5"
       label="(Obsolete) Set sync allowed by platform. Removed 01/2022."/>
   <int value="6" label="Credentials updated"/>
   <int value="7" label="Reset local Sync data"/>
+  <int value="8" label="Not signed in"/>
+  <int value="9" label="Enterprise policy"/>
+  <int value="10" label="Disable sync on client"/>
 </enum>
 
 <!-- LINT.ThenChange(/components/sync/service/sync_service_impl.h:SyncResetEngineReason) -->
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv
index bbf7e04..50a92cb2 100644
--- a/tools/perf/benchmark.csv
+++ b/tools/perf/benchmark.csv
@@ -53,7 +53,6 @@
 memory.desktop,lizeb@chromium.org,,,
 octane,"vahl@chromium.org, mlippautz@chromium.org",Blink>JavaScript,,all
 octane-nominorms,omerkatz@chromium.org,Blink>JavaScript>GarbageCollection,,all
-performance_browser_tests,jophba@chromium.org,Internals>Media>ScreenCapture,,
 power.desktop,brucedawson@chromium.org,,https://bit.ly/power-benchmarks,
 rasterize_and_record_micro.top_25,"pdr@chromium.org, wangxianzhu@chromium.org",Internals>Compositing>Rasterization,https://bit.ly/rasterize-and-record-benchmark,
 rendering.desktop,"jonross@chromium.org, chrome-gpu-metrics@google.com",Internals>GPU>Metrics,https://bit.ly/rendering-benchmarks,"backdrop_filter,gpu_rasterization,image_decoding,key_desktop_move,maps,motionmark,motionmark_fixed_2_seconds,motionmark_ramp,repaint_desktop,representative_mac_desktop,representative_mobile,representative_win_desktop,required_webgl,simple_canvas,throughput_test,top_real_world_desktop,tough_animation,tough_canvas,tough_compositor,tough_filters,tough_path_rendering,tough_pinch_zoom,tough_scheduling,tough_scrollbar_scrolling,tough_scrolling,tough_texture_upload,tough_webgl,use_fake_camera_device"
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py
index 9eb1716..27ec922 100644
--- a/tools/perf/core/bot_platforms.py
+++ b/tools/perf/core/bot_platforms.py
@@ -416,7 +416,6 @@
     # TODO(crbug.com/40562709): Add views_perftests.
     _base_perftests(200),
     _load_library_perf_tests(),
-    _performance_browser_tests(165),
     _tracing_perftests(5),
 ])
 _MAC_HIGH_END_BENCHMARK_CONFIGS = PerfSuite(OFFICIAL_BENCHMARK_CONFIGS).Remove([
@@ -426,7 +425,6 @@
 _MAC_HIGH_END_EXECUTABLE_CONFIGS = frozenset([
     _base_perftests(300),
     # _dawn_perf_tests(330),    # b/332611618
-    _performance_browser_tests(190),
     _views_perftests(),
 ])
 _MAC_LOW_END_BENCHMARK_CONFIGS = PerfSuite(OFFICIAL_BENCHMARK_CONFIGS).Remove([
@@ -435,7 +433,6 @@
 ])
 _MAC_LOW_END_EXECUTABLE_CONFIGS = frozenset([
     _load_library_perf_tests(),
-    _performance_browser_tests(210),
 ])
 _MAC_M1_MINI_2020_BENCHMARK_CONFIGS = PerfSuite(
     OFFICIAL_BENCHMARK_CONFIGS).Remove([
@@ -461,7 +458,6 @@
 _MAC_M1_MINI_2020_EXECUTABLE_CONFIGS = frozenset([
     _base_perftests(300),
     _dawn_perf_tests(330),
-    _performance_browser_tests(190),
     _views_perftests(),
 ])
 _MAC_M2_PRO_BENCHMARK_CONFIGS = PerfSuite(OFFICIAL_BENCHMARK_CONFIGS).Remove([
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index 3f371f5..3c79d2b 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -1489,22 +1489,17 @@
     'tracing_perftests':
     BenchmarkMetadata(
         'eseckler@chromium.org, khokhlov@chromium.org, kraskevich@chromium.org',
-        'Speed>Tracing'
-    ),
+        'Speed>Tracing'),
     'load_library_perf_tests':
     BenchmarkMetadata('xhwang@chromium.org, jrummell@chromium.org',
                       'Internals>Media>Encrypted'),
-    'performance_browser_tests':
-    BenchmarkMetadata('jophba@chromium.org',
-                      'Internals>Media>ScreenCapture'),
     'views_perftests':
     BenchmarkMetadata('tapted@chromium.org', 'Internals>Views'),
     'components_perftests':
     BenchmarkMetadata('csharrison@chromium.org'),
     'dawn_perf_tests':
     BenchmarkMetadata(
-        'enga@chromium.org',
-        'Dawn',
+        'enga@chromium.org', 'Dawn',
         'https://dawn.googlesource.com/dawn/+/HEAD/src/tests/perf_tests/README.md'
     ),
 }
diff --git a/tools/perf/core/shard_maps/linux-perf-calibration_map.json b/tools/perf/core/shard_maps/linux-perf-calibration_map.json
index e5a8588..e3e713e 100644
--- a/tools/perf/core/shard_maps/linux-perf-calibration_map.json
+++ b/tools/perf/core/shard_maps/linux-perf-calibration_map.json
@@ -346,20 +346,6 @@
             "speedometer3": {
                 "abridged": false
             }
-        },
-        "executables": {
-            "performance_browser_tests": {
-                "arguments": [
-                    "--full-performance-run",
-                    "--test-launcher-jobs=1",
-                    "--test-launcher-retry-limit=0",
-                    "--ui-test-action-timeout=60000",
-                    "--ui-test-action-max-timeout=60000",
-                    "--test-launcher-timeout=60000",
-                    "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*"
-                ],
-                "path": "browser_tests"
-            }
         }
     },
     "13": {
@@ -710,4 +696,4 @@
         "shard #26": 815.0,
         "shard #27": 820
     }
-}
\ No newline at end of file
+}
diff --git a/tools/perf/core/shard_maps/linux-perf-pgo_map.json b/tools/perf/core/shard_maps/linux-perf-pgo_map.json
index 5a5b038..c441866 100644
--- a/tools/perf/core/shard_maps/linux-perf-pgo_map.json
+++ b/tools/perf/core/shard_maps/linux-perf-pgo_map.json
@@ -206,20 +206,6 @@
                 "end": 4,
                 "abridged": false
             }
-        },
-        "executables": {
-            "performance_browser_tests": {
-                "arguments": [
-                    "--full-performance-run",
-                    "--test-launcher-jobs=1",
-                    "--test-launcher-retry-limit=0",
-                    "--ui-test-action-timeout=60000",
-                    "--ui-test-action-max-timeout=60000",
-                    "--test-launcher-timeout=60000",
-                    "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*"
-                ],
-                "path": "browser_tests"
-            }
         }
     },
     "13": {
diff --git a/tools/perf/core/shard_maps/linux-perf-rel_map.json b/tools/perf/core/shard_maps/linux-perf-rel_map.json
index 40a000fa..32eadff8 100644
--- a/tools/perf/core/shard_maps/linux-perf-rel_map.json
+++ b/tools/perf/core/shard_maps/linux-perf-rel_map.json
@@ -16,18 +16,6 @@
             },
             "load_library_perf_tests": {
                 "path": "load_library_perf_tests"
-            },
-            "performance_browser_tests": {
-                "arguments": [
-                    "--full-performance-run",
-                    "--test-launcher-jobs=1",
-                    "--test-launcher-retry-limit=0",
-                    "--ui-test-action-timeout=60000",
-                    "--ui-test-action-max-timeout=60000",
-                    "--test-launcher-timeout=60000",
-                    "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*"
-                ],
-                "path": "browser_tests"
             }
         }
     },
@@ -53,4 +41,4 @@
         "shard #0": 1172.0,
         "shard #1": 1186.0
     }
-}
\ No newline at end of file
+}
diff --git a/tools/perf/core/shard_maps/linux-perf_map.json b/tools/perf/core/shard_maps/linux-perf_map.json
index 0f868a3..4d40161c 100644
--- a/tools/perf/core/shard_maps/linux-perf_map.json
+++ b/tools/perf/core/shard_maps/linux-perf_map.json
@@ -621,20 +621,6 @@
             "speedometer3-predictable": {
                 "abridged": false
             }
-        },
-        "executables": {
-            "performance_browser_tests": {
-                "arguments": [
-                    "--full-performance-run",
-                    "--test-launcher-jobs=1",
-                    "--test-launcher-retry-limit=0",
-                    "--ui-test-action-timeout=60000",
-                    "--ui-test-action-max-timeout=60000",
-                    "--test-launcher-timeout=60000",
-                    "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*"
-                ],
-                "path": "browser_tests"
-            }
         }
     },
     "11": {
@@ -1034,4 +1020,4 @@
         "shard #24": 1300.0,
         "shard #25": 1647.0
     }
-}
\ No newline at end of file
+}
diff --git a/tools/perf/core/shard_maps/mac-laptop_high_end-perf-pgo_map.json b/tools/perf/core/shard_maps/mac-laptop_high_end-perf-pgo_map.json
index bac5787..ba1cb1c 100644
--- a/tools/perf/core/shard_maps/mac-laptop_high_end-perf-pgo_map.json
+++ b/tools/perf/core/shard_maps/mac-laptop_high_end-perf-pgo_map.json
@@ -225,20 +225,6 @@
                 "end": 12,
                 "abridged": false
             }
-        },
-        "executables": {
-            "performance_browser_tests": {
-                "arguments": [
-                    "--full-performance-run",
-                    "--test-launcher-jobs=1",
-                    "--test-launcher-retry-limit=0",
-                    "--ui-test-action-timeout=60000",
-                    "--ui-test-action-max-timeout=60000",
-                    "--test-launcher-timeout=60000",
-                    "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*"
-                ],
-                "path": "browser_tests"
-            }
         }
     },
     "14": {
diff --git a/tools/perf/core/shard_maps/mac-laptop_high_end-perf_map.json b/tools/perf/core/shard_maps/mac-laptop_high_end-perf_map.json
index b225a2b..9cef38e7 100644
--- a/tools/perf/core/shard_maps/mac-laptop_high_end-perf_map.json
+++ b/tools/perf/core/shard_maps/mac-laptop_high_end-perf_map.json
@@ -194,20 +194,6 @@
             "speedometer3": {
                 "abridged": false
             }
-        },
-        "executables": {
-            "performance_browser_tests": {
-                "arguments": [
-                    "--full-performance-run",
-                    "--test-launcher-jobs=1",
-                    "--test-launcher-retry-limit=0",
-                    "--ui-test-action-timeout=60000",
-                    "--ui-test-action-max-timeout=60000",
-                    "--test-launcher-timeout=60000",
-                    "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*"
-                ],
-                "path": "browser_tests"
-            }
         }
     },
     "7": {
@@ -503,4 +489,4 @@
         "shard #21": 1068.0,
         "shard #22": 1106.0
     }
-}
\ No newline at end of file
+}
diff --git a/tools/perf/core/shard_maps/mac-laptop_low_end-perf-pgo_map.json b/tools/perf/core/shard_maps/mac-laptop_low_end-perf-pgo_map.json
index 31352a3..a7bb124 100644
--- a/tools/perf/core/shard_maps/mac-laptop_low_end-perf-pgo_map.json
+++ b/tools/perf/core/shard_maps/mac-laptop_low_end-perf-pgo_map.json
@@ -205,20 +205,6 @@
                 "end": 6,
                 "abridged": false
             }
-        },
-        "executables": {
-            "performance_browser_tests": {
-                "arguments": [
-                    "--full-performance-run",
-                    "--test-launcher-jobs=1",
-                    "--test-launcher-retry-limit=0",
-                    "--ui-test-action-timeout=60000",
-                    "--ui-test-action-max-timeout=60000",
-                    "--test-launcher-timeout=60000",
-                    "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*"
-                ],
-                "path": "browser_tests"
-            }
         }
     },
     "13": {
diff --git a/tools/perf/core/shard_maps/mac-laptop_low_end-perf_map.json b/tools/perf/core/shard_maps/mac-laptop_low_end-perf_map.json
index b763b1d..7d6b6e40 100644
--- a/tools/perf/core/shard_maps/mac-laptop_low_end-perf_map.json
+++ b/tools/perf/core/shard_maps/mac-laptop_low_end-perf_map.json
@@ -123,20 +123,6 @@
             "octane": {
                 "abridged": false
             }
-        },
-        "executables": {
-            "performance_browser_tests": {
-                "arguments": [
-                    "--full-performance-run",
-                    "--test-launcher-jobs=1",
-                    "--test-launcher-retry-limit=0",
-                    "--ui-test-action-timeout=60000",
-                    "--ui-test-action-max-timeout=60000",
-                    "--test-launcher-timeout=60000",
-                    "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*"
-                ],
-                "path": "browser_tests"
-            }
         }
     },
     "6": {
@@ -360,4 +346,4 @@
         "shard #21": 1228.0,
         "shard #22": 1212.0
     }
-}
\ No newline at end of file
+}
diff --git a/tools/perf/core/shard_maps/mac-m1_mini_2020-perf_map.json b/tools/perf/core/shard_maps/mac-m1_mini_2020-perf_map.json
index c4d1ed93..0d264dea 100644
--- a/tools/perf/core/shard_maps/mac-m1_mini_2020-perf_map.json
+++ b/tools/perf/core/shard_maps/mac-m1_mini_2020-perf_map.json
@@ -278,20 +278,6 @@
             "speedometer3-nominorms": {
                 "abridged": false
             }
-        },
-        "executables": {
-            "performance_browser_tests": {
-                "arguments": [
-                    "--full-performance-run",
-                    "--test-launcher-jobs=1",
-                    "--test-launcher-retry-limit=0",
-                    "--ui-test-action-timeout=60000",
-                    "--ui-test-action-max-timeout=60000",
-                    "--test-launcher-timeout=60000",
-                    "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*"
-                ],
-                "path": "browser_tests"
-            }
         }
     },
     "8": {
@@ -668,4 +654,4 @@
         "shard #24": 823.0,
         "shard #25": 912.0
     }
-}
\ No newline at end of file
+}
diff --git a/tools/perf/core/shard_maps/timing_data/linux-perf-calibration_timing.json b/tools/perf/core/shard_maps/timing_data/linux-perf-calibration_timing.json
index b628d27..89daa644 100644
--- a/tools/perf/core/shard_maps/timing_data/linux-perf-calibration_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/linux-perf-calibration_timing.json
@@ -1,9 +1,5 @@
 [
     {
-        "duration": "165.0",
-        "name": "performance_browser_tests/_gtest_"
-    },
-    {
         "duration": "5.0",
         "name": "tracing_perftests/_gtest_"
     },
diff --git a/tools/perf/core/shard_maps/timing_data/linux-perf-pgo_timing.json b/tools/perf/core/shard_maps/timing_data/linux-perf-pgo_timing.json
index cd77746..1ae14813 100644
--- a/tools/perf/core/shard_maps/timing_data/linux-perf-pgo_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/linux-perf-pgo_timing.json
@@ -4,10 +4,6 @@
         "name": "load_library_perf_tests/_gtest_"
     },
     {
-        "duration": "165.0",
-        "name": "performance_browser_tests/_gtest_"
-    },
-    {
         "duration": "5.0",
         "name": "tracing_perftests/_gtest_"
     },
@@ -15,4 +11,4 @@
         "duration": "200.0",
         "name": "base_perftests/_gtest_"
     }
-]
\ No newline at end of file
+]
diff --git a/tools/perf/core/shard_maps/timing_data/linux-perf-rel_timing.json b/tools/perf/core/shard_maps/timing_data/linux-perf-rel_timing.json
index 4b3d4a61..47e0033 100644
--- a/tools/perf/core/shard_maps/timing_data/linux-perf-rel_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/linux-perf-rel_timing.json
@@ -316,10 +316,6 @@
         "name": "system_health.common_desktop/play:media:soundcloud:2018"
     },
     {
-        "duration": "165.0",
-        "name": "performance_browser_tests/_gtest_"
-    },
-    {
         "duration": "5.0",
         "name": "tracing_perftests/_gtest_"
     },
diff --git a/tools/perf/core/shard_maps/timing_data/linux-perf_timing.json b/tools/perf/core/shard_maps/timing_data/linux-perf_timing.json
index b97615e..17d6dbf 100644
--- a/tools/perf/core/shard_maps/timing_data/linux-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/linux-perf_timing.json
@@ -4520,10 +4520,6 @@
         "name": "load_library_perf_tests/_gtest_"
     },
     {
-        "duration": "165.0",
-        "name": "performance_browser_tests/_gtest_"
-    },
-    {
         "duration": "5.0",
         "name": "tracing_perftests/_gtest_"
     },
diff --git a/tools/perf/core/shard_maps/timing_data/mac-laptop_high_end-perf-pgo_timing.json b/tools/perf/core/shard_maps/timing_data/mac-laptop_high_end-perf-pgo_timing.json
index 51ea3a2..62da371 100644
--- a/tools/perf/core/shard_maps/timing_data/mac-laptop_high_end-perf-pgo_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/mac-laptop_high_end-perf-pgo_timing.json
@@ -1,9 +1,5 @@
 [
     {
-        "duration": "190.0",
-        "name": "performance_browser_tests/_gtest_"
-    },
-    {
         "duration": "7.0",
         "name": "views_perftests/_gtest_"
     },
@@ -15,4 +11,4 @@
         "duration": "330.0",
         "name": "dawn_perf_tests/_gtest_"
     }
-]
\ No newline at end of file
+]
diff --git a/tools/perf/core/shard_maps/timing_data/mac-laptop_high_end-perf_timing.json b/tools/perf/core/shard_maps/timing_data/mac-laptop_high_end-perf_timing.json
index b9c13f5..cb045eb 100644
--- a/tools/perf/core/shard_maps/timing_data/mac-laptop_high_end-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/mac-laptop_high_end-perf_timing.json
@@ -4402,9 +4402,5 @@
     {
         "duration": "7.0",
         "name": "views_perftests/_gtest_"
-    },
-    {
-        "duration": "190.0",
-        "name": "performance_browser_tests/_gtest_"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/mac-laptop_low_end-perf-pgo_timing.json b/tools/perf/core/shard_maps/timing_data/mac-laptop_low_end-perf-pgo_timing.json
index 5e4cc88..c204ddb 100644
--- a/tools/perf/core/shard_maps/timing_data/mac-laptop_low_end-perf-pgo_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/mac-laptop_low_end-perf-pgo_timing.json
@@ -2,9 +2,5 @@
     {
         "duration": "3.0",
         "name": "load_library_perf_tests/_gtest_"
-    },
-    {
-        "duration": "210.0",
-        "name": "performance_browser_tests/_gtest_"
     }
-]
\ No newline at end of file
+]
diff --git a/tools/perf/core/shard_maps/timing_data/mac-laptop_low_end-perf_timing.json b/tools/perf/core/shard_maps/timing_data/mac-laptop_low_end-perf_timing.json
index aa09fd75..170a8018 100644
--- a/tools/perf/core/shard_maps/timing_data/mac-laptop_low_end-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/mac-laptop_low_end-perf_timing.json
@@ -4346,9 +4346,5 @@
     {
         "duration": "3.0",
         "name": "load_library_perf_tests/_gtest_"
-    },
-    {
-        "duration": "210.0",
-        "name": "performance_browser_tests/_gtest_"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/mac-m1_mini_2020-perf_timing.json b/tools/perf/core/shard_maps/timing_data/mac-m1_mini_2020-perf_timing.json
index 54b6b44..2e9f7b0 100644
--- a/tools/perf/core/shard_maps/timing_data/mac-m1_mini_2020-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/mac-m1_mini_2020-perf_timing.json
@@ -4320,10 +4320,6 @@
         "name": "webrtc/pause_play_peerconnections"
     },
     {
-        "duration": "190.0",
-        "name": "performance_browser_tests/_gtest_"
-    },
-    {
         "duration": "7.0",
         "name": "views_perftests/_gtest_"
     },
diff --git a/tools/perf/core/undocumented_benchmarks.py b/tools/perf/core/undocumented_benchmarks.py
index 1c934c9..5dd1959 100644
--- a/tools/perf/core/undocumented_benchmarks.py
+++ b/tools/perf/core/undocumented_benchmarks.py
@@ -13,7 +13,6 @@
     'memory.desktop',
     'octane',
     'octane-nominorms',
-    'performance_browser_tests',
     'startup.mobile',
     'system_health.webview_startup',
     'tracing_perftests',
diff --git a/ui/base/ui_base_features.h b/ui/base/ui_base_features.h
index fde7d5b..bb579e5 100644
--- a/ui/base/ui_base_features.h
+++ b/ui/base/ui_base_features.h
@@ -14,8 +14,6 @@
 
 namespace features {
 
-// Keep sorted!
-
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 BASE_DECLARE_FEATURE(kExperimentalFlingAnimation);
 COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kFocusFollowsCursor);
diff --git a/ui/chromeos/file_manager_strings.grdp b/ui/chromeos/file_manager_strings.grdp
index d20f409a..c3a2a37 100644
--- a/ui/chromeos/file_manager_strings.grdp
+++ b/ui/chromeos/file_manager_strings.grdp
@@ -333,9 +333,6 @@
   <message name="IDS_FILE_BROWSER_ARCHIVE_MOUNT_FAILED" desc="Error message when an archive mount operation failed.">
     Could not open "<ph name="PATH">$1<ex>zipfile.zip</ex></ph>"
   </message>
-  <message name="IDS_FILE_BROWSER_ARCHIVE_MOUNT_INVALID_PATH" desc="Error message when trying to mount an archive from an unsupported path.">
-    Could not open "<ph name="PATH">$1<ex>zipfile.zip</ex></ph>" from this location. Please copy to "My files" to open.
-  </message>
   <message name="IDS_FILE_BROWSER_UNMOUNT_FAILED" desc="Title of the error dialog when device unmount operation failed.">
    <ph name="BEGIN_BOLD">&lt;b&gt;</ph>Don't remove your device just yet!<ph name="END_BOLD">&lt;/b&gt;</ph>
    <ph name="LINE_BREAKS">&lt;br/&gt;&lt;br/&gt;</ph>
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_ARCHIVE_MOUNT_INVALID_PATH.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_ARCHIVE_MOUNT_INVALID_PATH.png.sha1
deleted file mode 100644
index dd6969e..0000000
--- a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_ARCHIVE_MOUNT_INVALID_PATH.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-03519b35f702c4a53f11df433327ac58307dbf5c
\ No newline at end of file
diff --git a/ui/file_manager/file_manager/background/js/volume_manager.ts b/ui/file_manager/file_manager/background/js/volume_manager.ts
index 35b70a4..e737d4e 100644
--- a/ui/file_manager/file_manager/background/js/volume_manager.ts
+++ b/ui/file_manager/file_manager/background/js/volume_manager.ts
@@ -4,7 +4,7 @@
 
 import {assert} from 'chrome://resources/js/assert.js';
 
-import {getRootType, isComputersRoot, isFakeEntry, isSameEntry, isSameFileSystem, isTeamDriveRoot} from '../../common/js/entry_utils.js';
+import {getRootType, isComputersRoot, isFakeEntry, isOneDrivePlaceholder, isSameEntry, isSameFileSystem, isTeamDriveRoot} from '../../common/js/entry_utils.js';
 import type {FilesAppDirEntry, FilesAppEntry} from '../../common/js/files_app_entry_types.js';
 import {type CustomEventMap, FilesEventTarget} from '../../common/js/files_event_target.js';
 import {str} from '../../common/js/translations.js';
@@ -597,7 +597,8 @@
       // actually defer their logic to some underlying implementation or
       // delegate to the location filesystem.
       let isReadOnly = true;
-      if (rootType === RootType.RECENT || rootType === RootType.TRASH) {
+      if (rootType === RootType.RECENT || rootType === RootType.TRASH ||
+          (isOneDrivePlaceholder(entry))) {
         isReadOnly = false;
       }
       return new EntryLocation(
diff --git a/ui/file_manager/file_manager/common/js/entry_utils.ts b/ui/file_manager/file_manager/common/js/entry_utils.ts
index ae72b19..bac4df63 100644
--- a/ui/file_manager/file_manager/common/js/entry_utils.ts
+++ b/ui/file_manager/file_manager/common/js/entry_utils.ts
@@ -10,7 +10,7 @@
 import type {DirectoryItem} from '../../foreground/js/ui/directory_tree.js';
 import type {TreeItem} from '../../foreground/js/ui/tree.js';
 import {driveRootEntryListKey, myFilesEntryListKey, recentRootKey, trashRootKey} from '../../state/ducks/volumes.js';
-import {type CurrentDirectory, EntryType, type FileData, type State, type Volume} from '../../state/state.js';
+import {type CurrentDirectory, EntryType, type FileData, type FileKey, type State, type Volume} from '../../state/state.js';
 import {getEntry, getStore, getVolume} from '../../state/store.js';
 import type {XfTreeItem} from '../../widgets/xf_tree_item.js';
 
@@ -355,6 +355,13 @@
 }
 
 /**
+ * Returns true if the given entry is a placeholder for OneDrive.
+ */
+export function isOneDrivePlaceholder(entry: Entry|FilesAppEntry) {
+  return isFakeEntry(entry) && isOneDrivePlaceholderKey(entry.toURL());
+}
+
+/**
  * Compares two entries.
  * @return True if the both entry represents a same file or
  *     directory. Returns true if both entries are null.
@@ -906,6 +913,12 @@
   return isOneDriveId(volumeInfo?.providerId);
 }
 
+export function isOneDrivePlaceholderKey(key: FileKey|undefined) {
+  if (!key) {
+    return false;
+  }
+  return isOneDriveId(key.substr(key.lastIndexOf('/') + 1));
+}
 
 /**
  * Returns a boolean indicating whether the volume is a GuestOs volume. And
diff --git a/ui/file_manager/file_manager/common/js/files_app_entry_types.ts b/ui/file_manager/file_manager/common/js/files_app_entry_types.ts
index faea2112..1b69796 100644
--- a/ui/file_manager/file_manager/common/js/files_app_entry_types.ts
+++ b/ui/file_manager/file_manager/common/js/files_app_entry_types.ts
@@ -23,6 +23,7 @@
  */
 
 import type {VolumeInfo} from '../../background/js/volume_info.js';
+import {oneDriveFakeRootKey} from '../../state/ducks/volumes.js';
 
 import {isSameEntry} from './entry_utils.js';
 import {vmTypeToIconName} from './icon_util.js';
@@ -991,3 +992,27 @@
     return VolumeType.GUEST_OS;
   }
 }
+
+/**
+ * OneDrivePlaceholder is used to represent OneDrive in the UI, before being
+ * mounted and set up.
+ */
+export class OneDrivePlaceholder extends FakeEntryImpl {
+  constructor(label: string) {
+    super(label, RootType.PROVIDED);
+  }
+
+  override get typeName() {
+    return 'OneDrivePlaceholder';
+  }
+
+  // eslint-disable-next-line @typescript-eslint/naming-convention
+  override toURL() {
+    return oneDriveFakeRootKey;
+  }
+
+  override get iconName(): string {
+    // TODO(b/340168761): Use proper icon.
+    return RootType.DRIVE;
+  }
+}
diff --git a/ui/file_manager/file_manager/common/js/translations.ts b/ui/file_manager/file_manager/common/js/translations.ts
index 7f3aff93..91bd0ad 100644
--- a/ui/file_manager/file_manager/common/js/translations.ts
+++ b/ui/file_manager/file_manager/common/js/translations.ts
@@ -8,6 +8,7 @@
 import type {EntryLocation} from '../../background/js/entry_location_impl.js';
 import type {FilesAppEntry} from '../../common/js/files_app_entry_types.js';
 
+import {isOneDrivePlaceholder} from './entry_utils.js';
 import {getMediaViewRootTypeFromVolumeId, MediaViewRootType, RootType} from './volume_manager_types.js';
 
 
@@ -197,6 +198,12 @@
  */
 export function getEntryLabel(
     locationInfo: EntryLocation|null, entry: Entry|FilesAppEntry) {
+  if (isOneDrivePlaceholder(entry)) {
+    // Placeholders have locationInfo, but no locationInfo.volumeInfo
+    // so getRootTypeLabel() would return null.
+    return entry.name;
+  }
+
   if (locationInfo) {
     if (locationInfo.hasFixedLabel) {
       return getRootTypeLabel(locationInfo);
diff --git a/ui/file_manager/file_manager/foreground/js/directory_model.ts b/ui/file_manager/file_manager/foreground/js/directory_model.ts
index bbb0a80..f7c3911 100644
--- a/ui/file_manager/file_manager/foreground/js/directory_model.ts
+++ b/ui/file_manager/file_manager/foreground/js/directory_model.ts
@@ -9,10 +9,10 @@
 import type {VolumeManager} from '../../background/js/volume_manager.js';
 import type {SpliceEvent} from '../../common/js/array_data_model.js';
 import {Aggregator, AsyncQueue} from '../../common/js/async_util.js';
-import {convertURLsToEntries, entriesToURLs, getRootType, isFakeEntry, isGuestOs, isNativeEntry, isOneDriveId, isRecentRootType, isSameEntry, urlToEntry} from '../../common/js/entry_utils.js';
+import {convertURLsToEntries, entriesToURLs, getRootType, isFakeEntry, isGuestOs, isNativeEntry, isOneDrive, isOneDriveId, isOneDrivePlaceholder, isRecentRootType, isSameEntry, urlToEntry} from '../../common/js/entry_utils.js';
 import type {FakeEntry, FilesAppDirEntry, FilesAppEntry, GuestOsPlaceholder, UniversalDirectory} from '../../common/js/files_app_entry_types.js';
 import {type CustomEventMap, FilesEventTarget} from '../../common/js/files_event_target.js';
-import {isDlpEnabled, isDriveFsBulkPinningEnabled} from '../../common/js/flags.js';
+import {isDlpEnabled, isDriveFsBulkPinningEnabled, isSkyvaultV2Enabled} from '../../common/js/flags.js';
 import {recordMediumCount} from '../../common/js/metrics.js';
 import {getEntryLabel} from '../../common/js/translations.js';
 import {testSendMessage} from '../../common/js/util.js';
@@ -1541,6 +1541,20 @@
         }
       }
     }
+
+    // If the current directory is the OneDrive placeholder and the real
+    // OneDrive is mounted, switch to it.
+    if (isSkyvaultV2Enabled() && currentDir &&
+        isOneDrivePlaceholder(currentDir)) {
+      for (const newVolume of spliceEventDetail.added) {
+        if (isOneDrive(newVolume)) {
+          newVolume.resolveDisplayRoot().then((displayRoot: DirectoryEntry) => {
+            this.changeDirectoryEntry(displayRoot);
+          });
+        }
+      }
+    }
+
     if (spliceEventDetail.added.length !== 1) {
       return;
     }
@@ -1699,6 +1713,11 @@
         return new TrashContentScanner(this.volumeManager_);
       };
     }
+    if (isOneDrivePlaceholder(entry)) {
+      return () => {
+        return new EmptyContentScanner();
+      };
+    }
     if (sanitizedQuery) {
       return () => {
         return new SearchV2ContentScanner(
diff --git a/ui/file_manager/file_manager/foreground/js/empty_folder_controller.ts b/ui/file_manager/file_manager/foreground/js/empty_folder_controller.ts
index a4c0e008..5a28002 100644
--- a/ui/file_manager/file_manager/foreground/js/empty_folder_controller.ts
+++ b/ui/file_manager/file_manager/foreground/js/empty_folder_controller.ts
@@ -4,7 +4,7 @@
 
 import type {VolumeInfo} from '../../background/js/volume_info.js';
 import {queryRequiredElement} from '../../common/js/dom_utils.js';
-import {getODFSMetadataQueryEntry, isInteractiveVolume, isOneDrive, isRecentRootType} from '../../common/js/entry_utils.js';
+import {getODFSMetadataQueryEntry, isInteractiveVolume, isOneDrive, isOneDrivePlaceholderKey, isRecentRootType} from '../../common/js/entry_utils.js';
 import type {FakeEntry} from '../../common/js/files_app_entry_types.js';
 import {str} from '../../common/js/translations.js';
 import {FileErrorToDomError} from '../../common/js/util.js';
@@ -12,7 +12,7 @@
 import {updateIsInteractiveVolume} from '../../state/ducks/volumes.js';
 import {getStore} from '../../state/store.js';
 
-import {FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED} from './constants.js';
+import {FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED, ODFS_EXTENSION_ID} from './constants.js';
 import type {DirectoryModel} from './directory_model.js';
 import type {ProvidersModel} from './providers_model.js';
 
@@ -234,6 +234,9 @@
     if (currentVolumeInfo && isOneDrive(currentVolumeInfo) &&
         currentVolumeInfo.providerId !== undefined) {
       this.providersModel_.requestMount(currentVolumeInfo.providerId);
+    } else if (isOneDrivePlaceholderKey(
+                   this.directoryModel_.getCurrentFileKey())) {
+      this.providersModel_.requestMount(ODFS_EXTENSION_ID);
     }
   }
 
@@ -255,6 +258,10 @@
       // Show ODFS reauthentication required empty state if is it
       // non-interactive.
       svgRef = ODFS_REAUTHENTICATION_REQUIRED;
+    } else if (currentRootType === RootType.PROVIDED) {
+      if (isOneDrivePlaceholderKey(this.directoryModel_.getCurrentFileKey())) {
+        svgRef = ODFS_REAUTHENTICATION_REQUIRED;
+      }
     } else {
       const {search} = getStore().getState();
       if (search && search.query) {
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager.ts b/ui/file_manager/file_manager/foreground/js/file_manager.ts
index 28d6f12..9f0ee44 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager.ts
+++ b/ui/file_manager/file_manager/foreground/js/file_manager.ts
@@ -24,7 +24,7 @@
 import {EntryList, FakeEntryImpl} from '../../common/js/files_app_entry_types.js';
 import type {FilesAppState} from '../../common/js/files_app_state.js';
 import {FilteredVolumeManager} from '../../common/js/filtered_volume_manager.js';
-import {isDlpEnabled, isGuestOsEnabled, isMaterializedViewsEnabled, isNewDirectoryTreeEnabled} from '../../common/js/flags.js';
+import {isDlpEnabled, isGuestOsEnabled, isMaterializedViewsEnabled, isNewDirectoryTreeEnabled, isSkyvaultV2Enabled} from '../../common/js/flags.js';
 import {recordEnum, recordInterval, startInterval} from '../../common/js/metrics.js';
 import {ProgressItemState} from '../../common/js/progress_center_common.js';
 import {str} from '../../common/js/translations.js';
@@ -80,6 +80,7 @@
 import {NamingController} from './naming_controller.js';
 import {NavigationListModel, NavigationModelFakeItem, NavigationModelItemType} from './navigation_list_model.js';
 import {NavigationUma} from './navigation_uma.js';
+import {OneDriveController} from './one_drive_controller.js';
 import {ProvidersModel} from './providers_model.js';
 import {QuickViewController} from './quick_view_controller.js';
 import {QuickViewModel} from './quick_view_model.js';
@@ -255,6 +256,11 @@
   protected lastModifiedController_: LastModifiedController|null = null;
 
   /**
+   * OneDrive controller.
+   */
+  protected oneDriveController_: OneDriveController|null = null;
+
+  /**
    * Component for main window and its misc UI parts.
    */
   protected mainWindowComponent_: null|MainWindowComponent = null;
@@ -1185,6 +1191,10 @@
           this.ui_.directoryTree as DirectoryTree, this.volumeManager_);
       await this.guestOsController_.refresh();
     }
+
+    if (isSkyvaultV2Enabled()) {
+      this.oneDriveController_ = new OneDriveController();
+    }
   }
 
   /**
diff --git a/ui/file_manager/file_manager/foreground/js/file_tasks.ts b/ui/file_manager/file_manager/foreground/js/file_tasks.ts
index 2486755..0c29f2c 100644
--- a/ui/file_manager/file_manager/foreground/js/file_tasks.ts
+++ b/ui/file_manager/file_manager/foreground/js/file_tasks.ts
@@ -779,10 +779,7 @@
       const item = new ProgressCenterItem();
       item.id = 'Cannot mount: ' + url;
       item.type = ProgressItemType.MOUNT_ARCHIVE;
-      const msgId = error === VolumeError.INVALID_PATH ?
-          'ARCHIVE_MOUNT_INVALID_PATH' :
-          'ARCHIVE_MOUNT_FAILED';
-      item.message = strf(msgId, filename);
+      item.message = strf('ARCHIVE_MOUNT_FAILED', filename);
       item.state = ProgressItemState.ERROR;
       this.progressCenter_.updateItem(item);
 
diff --git a/ui/file_manager/file_manager/foreground/js/one_drive_controller.ts b/ui/file_manager/file_manager/foreground/js/one_drive_controller.ts
new file mode 100644
index 0000000..b2152352
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/js/one_drive_controller.ts
@@ -0,0 +1,68 @@
+// 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.
+
+import {isOneDriveId} from '../../common/js/entry_utils.js';
+import {OneDrivePlaceholder} from '../../common/js/files_app_entry_types.js';
+import {isSkyvaultV2Enabled} from '../../common/js/flags.js';
+import {addUiEntry, removeUiEntry} from '../../state/ducks/ui_entries.js';
+import {oneDriveFakeRootKey} from '../../state/ducks/volumes.js';
+import type {State, Volume} from '../../state/state.js';
+import {getStore} from '../../state/store.js';
+import type {Store} from '../../state/store.js';
+
+/**
+ * OneDriveController handles the foreground UI relating to ODFS placeholder.
+ */
+export class OneDriveController {
+  private localUserFilesAllowed_: boolean|undefined = undefined;
+  private defaultLocation_: chrome.fileManagerPrivate.DefaultLocation|
+      undefined = undefined;
+  private oneDriveMounted_: boolean|undefined = undefined;
+
+  private store_: Store;
+
+  constructor() {
+    this.store_ = getStore();
+    this.store_.subscribe(this);
+  }
+
+  async onStateChanged(state: State) {
+    if (!isSkyvaultV2Enabled()) {
+      return;
+    }
+    const localUserFilesAllowed = state.preferences?.localUserFilesAllowed;
+    const defaultLocation = state.preferences?.defaultLocation;
+    const oneDriveMounted =
+        Object.values<Volume>(state.volumes)
+            .find(volume => isOneDriveId(volume.providerId)) !== undefined;
+
+    if (this.localUserFilesAllowed_ !== localUserFilesAllowed ||
+        this.defaultLocation_ !== defaultLocation ||
+        this.oneDriveMounted_ !== oneDriveMounted) {
+      this.localUserFilesAllowed_ = localUserFilesAllowed;
+      this.defaultLocation_ = defaultLocation;
+      this.oneDriveMounted_ = oneDriveMounted;
+      this.refresh();
+    }
+  }
+
+  /**
+   * Adds or removes the OneDrive placeholder based on whether OneDrive is
+   * mounted/unmounted and the SkyVault policies.
+   */
+  async refresh() {
+    if (!isSkyvaultV2Enabled()) {
+      return;
+    }
+    if (!this.localUserFilesAllowed_ && !this.oneDriveMounted_ &&
+        this.defaultLocation_ ===
+            chrome.fileManagerPrivate.DefaultLocation.ONEDRIVE) {
+      // TODO(b/334511998): Use proper strings.
+      const oneDriveFakeRoot = new OneDrivePlaceholder('Microsoft OneDrive');
+      this.store_.dispatch(addUiEntry(oneDriveFakeRoot));
+    } else {
+      this.store_.dispatch(removeUiEntry(oneDriveFakeRootKey));
+    }
+  }
+}
diff --git a/ui/file_manager/file_manager/state/ducks/all_entries.ts b/ui/file_manager/file_manager/state/ducks/all_entries.ts
index 127b333..d9f6bbb 100644
--- a/ui/file_manager/file_manager/state/ducks/all_entries.ts
+++ b/ui/file_manager/file_manager/state/ducks/all_entries.ts
@@ -487,6 +487,8 @@
         case RootType.DRIVE_SHARED_WITH_ME:
           // TODO(lucmult): This isn't really Recent but it's the closest.
           return EntryType.RECENT;
+        case RootType.PROVIDED:
+          return EntryType.PLACEHOLDER;
       }
       console.warn(`Invalid fakeEntry.rootType='${entry.rootType} rootType`);
       return EntryType.PLACEHOLDER;
@@ -494,6 +496,8 @@
       return EntryType.PLACEHOLDER;
     case 'TrashEntry':
       return EntryType.TRASH;
+    case 'OneDrivePlaceholder':
+      return EntryType.PLACEHOLDER;
     default:
       console.warn(`Invalid entry.typeName='${entry.typeName}`);
       return EntryType.FS_API;
diff --git a/ui/file_manager/file_manager/state/ducks/navigation.ts b/ui/file_manager/file_manager/state/ducks/navigation.ts
index eebef27..1bd3e78 100644
--- a/ui/file_manager/file_manager/state/ducks/navigation.ts
+++ b/ui/file_manager/file_manager/state/ducks/navigation.ts
@@ -4,11 +4,12 @@
 
 import {isOneDriveId} from '../../common/js/entry_utils.js';
 import type {EntryList, FilesAppEntry, VolumeEntry} from '../../common/js/files_app_entry_types.js';
+import {isSkyvaultV2Enabled} from '../../common/js/flags.js';
 import {VolumeType} from '../../common/js/volume_manager_types.js';
 import {Slice} from '../../lib/base_store.js';
 import {type AndroidApp, DialogType, type NavigationKey, type NavigationRoot, NavigationSection, NavigationType, type State, type Volume} from '../../state/state.js';
 import {getMyFiles} from '../ducks/all_entries.js';
-import {driveRootEntryListKey, recentRootKey, trashRootKey} from '../ducks/volumes.js';
+import {driveRootEntryListKey, oneDriveFakeRootKey, recentRootKey, trashRootKey} from '../ducks/volumes.js';
 import {getEntry} from '../store.js';
 
 /**
@@ -160,6 +161,21 @@
     processedEntryKeys.add(driveEntry.toURL());
   }
 
+  // Add OneDrive placeholder if needed.
+  // OneDrive is always added directly below Drive.
+  if (isSkyvaultV2Enabled()) {
+    const oneDriveUIEntryExists =
+        currentState.uiEntries.includes(oneDriveFakeRootKey);
+    if (oneDriveUIEntryExists) {
+      roots.push({
+        key: oneDriveFakeRootKey,
+        section: NavigationSection.ODFS,
+        separator: true,
+        type: NavigationType.VOLUME,
+      });
+      processedEntryKeys.add(oneDriveFakeRootKey);
+    }
+  }
 
   // Other volumes.
   const volumesOrder: Partial<Record<VolumeType, number>> = {
diff --git a/ui/file_manager/file_manager/state/ducks/volumes.ts b/ui/file_manager/file_manager/state/ducks/volumes.ts
index 5a8501f..dfe69ad7 100644
--- a/ui/file_manager/file_manager/state/ducks/volumes.ts
+++ b/ui/file_manager/file_manager/state/ducks/volumes.ts
@@ -10,7 +10,7 @@
 import {str} from '../../common/js/translations.js';
 import type {GetActionFactoryPayload} from '../../common/js/util.js';
 import {RootType, Source, VolumeType} from '../../common/js/volume_manager_types.js';
-import {ICON_TYPES} from '../../foreground/js/constants.js';
+import {ICON_TYPES, ODFS_EXTENSION_ID} from '../../foreground/js/constants.js';
 import type {ActionsProducerGen} from '../../lib/actions_producer.js';
 import {Slice} from '../../lib/base_store.js';
 import {PropStatus, type State, type Volume, type VolumeId} from '../../state/state.js';
@@ -34,6 +34,8 @@
 export const recentRootKey = `fake-entry://${RootType.RECENT}/all`;
 export const trashRootKey = `fake-entry://${RootType.TRASH}`;
 export const driveRootEntryListKey = `entry-list://${RootType.DRIVE_FAKE_ROOT}`;
+export const oneDriveFakeRootKey =
+    `fake-entry://${RootType.PROVIDED}/${ODFS_EXTENSION_ID}`;
 export const makeRemovableParentKey =
     (volume: Volume|chrome.fileManagerPrivate.VolumeMetadata) => {
       // Should be consistent with EntryList's toURL() method.
diff --git a/ui/file_manager/file_names.gni b/ui/file_manager/file_names.gni
index 0086c59..f89a6ed 100644
--- a/ui/file_manager/file_names.gni
+++ b/ui/file_manager/file_names.gni
@@ -216,6 +216,7 @@
   "file_manager/foreground/js/constants.ts",
   "file_manager/foreground/js/crossover_search_utils.ts",
   "file_manager/foreground/js/crostini_controller.ts",
+  "file_manager/foreground/js/one_drive_controller.ts",
   "file_manager/foreground/js/deferred_elements.ts",
   "file_manager/foreground/js/dialog_action_controller.ts",
   "file_manager/foreground/js/directory_contents.ts",
diff --git a/ui/file_manager/integration_tests/file_manager/file_display.ts b/ui/file_manager/integration_tests/file_manager/file_display.ts
index f6a10b3..1dbf320 100644
--- a/ui/file_manager/integration_tests/file_manager/file_display.ts
+++ b/ui/file_manager/integration_tests/file_manager/file_display.ts
@@ -985,7 +985,8 @@
   await remoteCall.waitForVolumesCount(2);
 
   // Enable SkyVault, this should unmount Downloads.
-  await sendTestMessage({name: 'setupSkyVault'});
+  await sendTestMessage(
+      {name: 'setupSkyVault', defaultLocation: 'google_drive'});
   await remoteCall.waitForVolumesCount(1);
 
   // Open Files app without specifying the initial directory/root.
@@ -1027,8 +1028,46 @@
   await remoteCall.waitUntilCurrentDirectoryIsChanged(appId, '/My files');
 
   // Disable local storage.
-  await sendTestMessage({name: 'setupSkyVault'});
+  await sendTestMessage(
+      {name: 'setupSkyVault', defaultLocation: 'google_drive'});
 
   // We should navigate to Drive.
   await remoteCall.waitUntilCurrentDirectoryIsChanged(appId, '/My Drive');
 }
+
+/**
+ * Tests that disabling local storage while in a local folder navigates away to
+ * the default set by the policy, e.g. Drive.
+ */
+export async function fileDisplayOneDrivePlaceholder() {
+  // Mount Downloads.
+  await sendTestMessage({name: 'mountDownloads'});
+
+  // Open Files app without specifying the initial directory/root.
+  const appId = await remoteCall.openNewWindow(null, null);
+  chrome.test.assertTrue(!!appId, 'failed to open new window');
+
+  // Confirm that the Files App opened in MyFiles.
+  await remoteCall.waitUntilCurrentDirectoryIsChanged(appId, '/My files');
+
+  // Confirm that OneDrive isn't shown yet.
+  const directoryTree = await DirectoryTreePageObject.create(appId);
+  const oneDriveLabel = 'Microsoft OneDrive';
+  directoryTree.waitForSelectedItemLostByLabel(oneDriveLabel);
+
+  // Disable local storage.
+  await sendTestMessage(
+      {name: 'setupSkyVault', defaultLocation: 'microsoft_onedrive'});
+
+  // Check that the placeholder is added.
+  await directoryTree.waitForItemByLabel(oneDriveLabel);
+
+  // TODO(b/340170015): this should happen automatically.
+  // We should navigate to OneDrive.
+  await directoryTree.selectItemByLabel(oneDriveLabel);
+  await remoteCall.waitUntilCurrentDirectoryIsChanged(
+      appId, `/${oneDriveLabel}`);
+
+  // Check: the empty folder should be visible.
+  await remoteCall.waitForElement(appId, '#empty-folder:not([hidden])');
+}
diff --git a/url/url_util_unittest.cc b/url/url_util_unittest.cc
index 016475b..4435b37 100644
--- a/url/url_util_unittest.cc
+++ b/url/url_util_unittest.cc
@@ -350,85 +350,6 @@
   }
 }
 
-TEST_F(URLUtilTest, TestResolveRelativeWithNonStandardBase) {
-  // This tests non-standard (in the sense that IsStandard() == false)
-  // hierarchical schemes.
-  struct ResolveRelativeCase {
-    const char* base;
-    const char* rel;
-    bool is_valid;
-    const char* out;
-  } resolve_non_standard_cases[] = {
-      // Resolving a relative path against a non-hierarchical URL should fail.
-      {"scheme:opaque_data", "/path", false, ""},
-      // Resolving a relative path against a non-standard authority-based base
-      // URL doesn't alter the authority section.
-      {"scheme://Authority/", "../path", true, "scheme://Authority/path"},
-      // A non-standard hierarchical base is resolved with path URL
-      // canonicalization rules.
-      {"data:/Blah:Blah/", "file.html", true, "data:/Blah:Blah/file.html"},
-      {"data:/Path/../part/part2", "file.html", true,
-       "data:/Path/../part/file.html"},
-      {"data://text/html,payload", "//user:pass@host:33////payload22", true,
-       "data://user:pass@host:33////payload22"},
-      // Path URL canonicalization rules also apply to non-standard authority-
-      // based URLs.
-      {"custom://Authority/", "file.html", true,
-       "custom://Authority/file.html"},
-      {"custom://Authority/", "other://Auth/", true, "other://Auth/"},
-      {"custom://Authority/", "../../file.html", true,
-       "custom://Authority/file.html"},
-      {"custom://Authority/path/", "file.html", true,
-       "custom://Authority/path/file.html"},
-      {"custom://Authority:NoCanon/path/", "file.html", true,
-       "custom://Authority:NoCanon/path/file.html"},
-      // A path with an authority section gets canonicalized under standard URL
-      // rules, even though the base was non-standard.
-      {"content://content.Provider/", "//other.Provider", true,
-       "content://other.provider/"},
-      // Resolving an absolute URL doesn't cause canonicalization of the
-      // result.
-      {"about:blank", "custom://Authority", true, "custom://Authority"},
-      // Fragment URLs can be resolved against a non-standard base.
-      {"scheme://Authority/path", "#fragment", true,
-       "scheme://Authority/path#fragment"},
-      {"scheme://Authority/", "#fragment", true,
-       "scheme://Authority/#fragment"},
-      // Test resolving a fragment (only) against any kind of base-URL.
-      {"about:blank", "#id42", true, "about:blank#id42"},
-      {"about:blank", " #id42", true, "about:blank#id42"},
-      {"about:blank#oldfrag", "#newfrag", true, "about:blank#newfrag"},
-      {"about:blank", " #id:42", true, "about:blank#id:42"},
-      // A surprising side effect of allowing fragments to resolve against
-      // any URL scheme is we might break javascript: URLs by doing so...
-      {"javascript:alert('foo#bar')", "#badfrag", true,
-       "javascript:alert('foo#badfrag"},
-  };
-
-  for (const auto& test : resolve_non_standard_cases) {
-    SCOPED_TRACE(testing::Message()
-                 << "base: " << test.base << ", rel: " << test.rel);
-
-    Parsed base_parsed =
-        url::IsUsingStandardCompliantNonSpecialSchemeURLParsing()
-            ? ParseNonSpecialURL(test.base)
-            : ParsePathURL(test.base, /*trim_path_end=*/true);
-
-    std::string resolved;
-    StdStringCanonOutput output(&resolved);
-    Parsed resolved_parsed;
-    bool valid =
-        ResolveRelative(test.base, strlen(test.base), base_parsed, test.rel,
-                        strlen(test.rel), nullptr, &output, &resolved_parsed);
-    output.Complete();
-
-    EXPECT_EQ(test.is_valid, valid);
-    if (test.is_valid && valid) {
-      EXPECT_EQ(test.out, resolved);
-    }
-  }
-}
-
 TEST_F(URLUtilTest, PotentiallyDanglingMarkup) {
   struct ResolveRelativeCase {
     const char* base;
@@ -760,6 +681,85 @@
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
+TEST_F(URLUtilTest, TestResolveRelativeWithNonStandardBase) {
+  // This tests non-standard (in the sense that IsStandard() == false)
+  // hierarchical schemes.
+  struct ResolveRelativeCase {
+    const char* base;
+    const char* rel;
+    bool is_valid;
+    const char* out;
+  } resolve_non_standard_cases[] = {
+      // Resolving a relative path against a non-hierarchical URL should fail.
+      {"scheme:opaque_data", "/path", false, ""},
+      // Resolving a relative path against a non-standard authority-based base
+      // URL doesn't alter the authority section.
+      {"scheme://Authority/", "../path", true, "scheme://Authority/path"},
+      // A non-standard hierarchical base is resolved with path URL
+      // canonicalization rules.
+      {"data:/Blah:Blah/", "file.html", true, "data:/Blah:Blah/file.html"},
+      {"data:/Path/../part/part2", "file.html", true,
+       "data:/Path/../part/file.html"},
+      {"data://text/html,payload", "//user:pass@host:33////payload22", true,
+       "data://user:pass@host:33////payload22"},
+      // Path URL canonicalization rules also apply to non-standard authority-
+      // based URLs.
+      {"custom://Authority/", "file.html", true,
+       "custom://Authority/file.html"},
+      {"custom://Authority/", "other://Auth/", true, "other://Auth/"},
+      {"custom://Authority/", "../../file.html", true,
+       "custom://Authority/file.html"},
+      {"custom://Authority/path/", "file.html", true,
+       "custom://Authority/path/file.html"},
+      {"custom://Authority:NoCanon/path/", "file.html", true,
+       "custom://Authority:NoCanon/path/file.html"},
+      // A path with an authority section gets canonicalized under standard URL
+      // rules, even though the base was non-standard.
+      {"content://content.Provider/", "//other.Provider", true,
+       "content://other.provider/"},
+      // Resolving an absolute URL doesn't cause canonicalization of the
+      // result.
+      {"about:blank", "custom://Authority", true, "custom://Authority"},
+      // Fragment URLs can be resolved against a non-standard base.
+      {"scheme://Authority/path", "#fragment", true,
+       "scheme://Authority/path#fragment"},
+      {"scheme://Authority/", "#fragment", true,
+       "scheme://Authority/#fragment"},
+      // Test resolving a fragment (only) against any kind of base-URL.
+      {"about:blank", "#id42", true, "about:blank#id42"},
+      {"about:blank", " #id42", true, "about:blank#id42"},
+      {"about:blank#oldfrag", "#newfrag", true, "about:blank#newfrag"},
+      {"about:blank", " #id:42", true, "about:blank#id:42"},
+      // A surprising side effect of allowing fragments to resolve against
+      // any URL scheme is we might break javascript: URLs by doing so...
+      {"javascript:alert('foo#bar')", "#badfrag", true,
+       "javascript:alert('foo#badfrag"},
+  };
+
+  for (const auto& test : resolve_non_standard_cases) {
+    SCOPED_TRACE(testing::Message()
+                 << "base: " << test.base << ", rel: " << test.rel);
+
+    Parsed base_parsed =
+        url::IsUsingStandardCompliantNonSpecialSchemeURLParsing()
+            ? ParseNonSpecialURL(test.base)
+            : ParsePathURL(test.base, /*trim_path_end=*/true);
+
+    std::string resolved;
+    StdStringCanonOutput output(&resolved);
+    Parsed resolved_parsed;
+    bool valid =
+        ResolveRelative(test.base, strlen(test.base), base_parsed, test.rel,
+                        strlen(test.rel), nullptr, &output, &resolved_parsed);
+    output.Complete();
+
+    EXPECT_EQ(test.is_valid, valid);
+    if (test.is_valid && valid) {
+      EXPECT_EQ(test.out, resolved);
+    }
+  }
+}
+
 TEST_P(URLUtilTypedTest, TestNoRefComponent) {
   // This test was originally written before full support for non-special URLs
   // became available. We need a flag-dependent test here because the test uses
diff --git a/v8 b/v8
index 90dbaf0..66102d2 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 90dbaf0f0a87e4a735175a655b95f86cb6445615
+Subproject commit 66102d235335e4000aa5e3276c522f35aefb7c05