diff --git a/DEPS b/DEPS
index 77f7958c..f6673725 100644
--- a/DEPS
+++ b/DEPS
@@ -280,7 +280,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'e56496eb35a3e20114d1a0052348e43b363f3cd4',
+  'skia_revision': '2cf673f5ebbb1c2a3688a73fa66c1d0110a7bd38',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -288,7 +288,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'db8e5617bafaa8374b0cd2465de3fce54622f00e',
+  'angle_revision': '7fb481a64d71d87b183d54352d983caa772d0182',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -300,7 +300,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
-  'boringssl_revision': '9338cc251292124d3bc49b2f790a69f9ad87d5f3',
+  'boringssl_revision': 'ca3146c5630035d07de160743a39a22125bf80c4',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
@@ -348,7 +348,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '6349b2a0fe82a0f7b941c066fa4e0de03b5fccfa',
+  'catapult_revision': 'd74466096c7fdd9f55c7c2516f0dced564e5f30d',
   # 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.
@@ -356,7 +356,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
-  'crossbench_revision': 'ec04484249c02607583033d717821359b7a0afeb',
+  'crossbench_revision': '883775bd2fd7de0c22acacc1cb150f44ff4b6e94',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -372,7 +372,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '435b93d9d72ecd3e120010bdcb955aab030afb75',
+  'devtools_frontend_revision': '037203201c416c40a7693c54c8d9c2f5d71e34f2',
   # 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.
@@ -396,11 +396,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': '9c149a580bd4e6958435524b0391120d8f7e07e0',
+  'dawn_revision': 'd73d332c6b0ab0f178ac25cac88a02bdf7482c8f',
   # 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': '2f180e16310126c4fc945d52f478c5c7c8411703',
+  'quiche_revision': '981c424462d9e5210dc843e92b325c93d3bee4e9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ink
   # and whatever else without interference from each other.
@@ -460,7 +460,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'cros_components_revision': '4382ff679d80fc174d54bc2e89ef0079520e5880',
+  'cros_components_revision': 'a155e2d0d2827dcbcbbe2751d98851f75705585e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -503,7 +503,7 @@
   'libcxx_revision':       'd0ddad5b79581e19d8e1aec627bb2ad86e1554cd',
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:7296b601ea80252ccf8cce300c4bebcabf235f20',
+  'gn_version': 'git_revision:c97a86a72105f3328a540f5a5ab17d11989ab7dd',
 
   # ninja CIPD package.
   'ninja_package': 'infra/3pp/tools/ninja/',
@@ -1304,7 +1304,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '39154b6f5dc2836f6dac6e46c711d1c737beb3fd',
+    '644765e55ff47d34b1ceb3191960588015a586f2',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1463,7 +1463,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'Tbd2jzkigki1yjkveky90Wa1TceQZfJlwasTJ1ObNY8C',
+          'version': 'xBUj1mP4Zg3S1QXof2DZhYVV5nhfIcZlXLVp5heLaH8C',
       },
     ],
     'condition': 'checkout_android and non_git_source',
@@ -2669,7 +2669,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'b766572d2b4aaa82b644a12a9413794da5e02e56',
+    Var('webrtc_git') + '/src.git' + '@' + 'b2120cb723c7fd4f92a4a2486f1d0e437066a462',
 
   # 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.
@@ -2795,7 +2795,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/boca_app/app',
-        'version': 'tN-mkAbmQKMdLFpJju9zZmLplu3YlIZ4lEpntY6yXPsC',
+        'version': '6n8zZuUP2zVCU01uFmNg8eCMfSJdDwsN4swtWw1nPOMC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -4431,7 +4431,7 @@
 
   'src/components/optimization_guide/internal': {
       'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' +
-        'f922d0d5ccb76da8ca58e7feeac432cd43b0d214',
+        '31cb54d3ac17e8a7fe30aca3e1a0b29d26c2acc6',
       'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
index 794d7907..9707cac 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -606,9 +606,6 @@
         Flag.baseFeature(BaseFeatures.THREAD_POOL_CAP2, "Sets a fixed thread pool cap"),
         Flag.baseFeature("ThreadGroupSemaphore"),
         Flag.baseFeature(
-                BlinkFeatures.CSS_LAZY_PARSING_FAST_PATH,
-                "Enables a fast-path for skipping lazily-parsed CSS declaration blocks"),
-        Flag.baseFeature(
                 ContentFeatures.QUEUE_NAVIGATIONS_WHILE_WAITING_FOR_COMMIT,
                 "If enabled, allows navigations to be queued when there is "
                         + "an existing pending commit navigation in progress."),
diff --git a/ash/app_list/app_list_util.cc b/ash/app_list/app_list_util.cc
index 0b6cfac..65e686f 100644
--- a/ash/app_list/app_list_util.cc
+++ b/ash/app_list/app_list_util.cc
@@ -6,10 +6,15 @@
 
 #include "ash/app_list/model/app_list_folder_item.h"
 #include "ash/app_list/model/app_list_item.h"
+#include "ash/capture_mode/capture_mode_constants.h"
 #include "ash/constants/ash_constants.h"
 #include "ash/constants/ash_features.h"
+#include "ash/constants/ash_pref_names.h"
+#include "ash/session/session_controller_impl.h"
+#include "ash/shell.h"
 #include "ash/style/ash_color_id.h"
 #include "ash/style/ash_color_provider.h"
+#include "components/prefs/pref_service.h"
 #include "ui/events/event.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/rect.h"
@@ -169,4 +174,12 @@
   return kAppsGridCardifiedScale;
 }
 
+void SetSunfishLauncherNudgeShownCount(int count) {
+  auto* session_controller = Shell::Get()->session_controller();
+  if (session_controller && !session_controller->IsUserSessionBlocked()) {
+    session_controller->GetActivePrefService()->SetInteger(
+        prefs::kSunfishLauncherNudgeShownCount, count);
+  }
+}
+
 }  // namespace ash
diff --git a/ash/app_list/app_list_util.h b/ash/app_list/app_list_util.h
index 07b9cb5..b7a45148 100644
--- a/ash/app_list/app_list_util.h
+++ b/ash/app_list/app_list_util.h
@@ -83,6 +83,10 @@
 // Get the scale factor for the cardified apps grid and app icons.
 ASH_EXPORT float GetAppsGridCardifiedScale();
 
+// Sets the user pref for how many times the Sunfish launcher nudge was shown
+// (if the user is signed into an active session).
+ASH_EXPORT void SetSunfishLauncherNudgeShownCount(int count);
+
 }  // namespace ash
 
 #endif  // ASH_APP_LIST_APP_LIST_UTIL_H_
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc
index 5edc423a..98b7f3bd 100644
--- a/ash/app_list/views/search_box_view.cc
+++ b/ash/app_list/views/search_box_view.cc
@@ -25,6 +25,7 @@
 #include "ash/app_list/views/search_result_base_view.h"
 #include "ash/ash_element_identifiers.h"
 #include "ash/assistant/ui/main_stage/launcher_search_iph_view.h"
+#include "ash/capture_mode/capture_mode_constants.h"
 #include "ash/capture_mode/capture_mode_controller.h"
 #include "ash/constants/ash_features.h"
 #include "ash/keyboard/ui/keyboard_ui_controller.h"
@@ -1248,6 +1249,11 @@
     // Only hide the launcher bubble in clamshell mode.
     view_delegate_->DismissAppList();
   }
+
+  // If the user presses the button, there is no need to show the nudge anymore,
+  // so set the pref to its limit.
+  SetSunfishLauncherNudgeShownCount(capture_mode::kSunfishNudgeMaxShownCount);
+
   CaptureModeController::Get()->StartSunfishSession();
 }
 
diff --git a/ash/assistant/ui/main_stage/assistant_ui_element_view_animator.cc b/ash/assistant/ui/main_stage/assistant_ui_element_view_animator.cc
index d0b71544e..5ad60e5 100644
--- a/ash/assistant/ui/main_stage/assistant_ui_element_view_animator.cc
+++ b/ash/assistant/ui/main_stage/assistant_ui_element_view_animator.cc
@@ -36,7 +36,7 @@
 
 AssistantUiElementViewAnimator::AnimationSmoothnessCallback
 AssistantUiElementViewAnimator::GetAnimationSmoothnessCallback() const {
-  return base::BindRepeating<void(const std::string&, int value)>(
+  return base::BindRepeating<void(std::string_view, int value)>(
       base::UmaHistogramPercentage, animation_smoothness_histogram_);
 }
 
diff --git a/ash/assistant/ui/main_stage/suggestion_container_view.cc b/ash/assistant/ui/main_stage/suggestion_container_view.cc
index a680674..f6c7e29 100644
--- a/ash/assistant/ui/main_stage/suggestion_container_view.cc
+++ b/ash/assistant/ui/main_stage/suggestion_container_view.cc
@@ -68,14 +68,14 @@
   void AnimateIn(ui::CallbackLayerAnimationObserver* observer) override {
     StartLayerAnimationSequence(
         layer()->GetAnimator(), CreateAnimateInAnimation(), observer,
-        base::BindRepeating<void(const std::string&, int)>(
+        base::BindRepeating<void(const std::string_view, int)>(
             base::UmaHistogramPercentage, kAssistantSuggestionChipHistogram));
   }
 
   void AnimateOut(ui::CallbackLayerAnimationObserver* observer) override {
     StartLayerAnimationSequence(
         layer()->GetAnimator(), CreateAnimateOutAnimation(), observer,
-        base::BindRepeating<void(const std::string&, int)>(
+        base::BindRepeating<void(const std::string_view, int)>(
             base::UmaHistogramPercentage, kAssistantSuggestionChipHistogram));
   }
 
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc
index 6fee71c..5d2d320 100644
--- a/ash/capture_mode/capture_mode_session.cc
+++ b/ash/capture_mode/capture_mode_session.cc
@@ -2658,7 +2658,28 @@
     }
   };
 
-  if (ShowDefaultActionButtonsOrPerformSearch()) {
+  // TODO(b/377569542): Move and consolidate with `UpdateCaptureRegion()`.
+  // TODO(b/367882127): May also need to check if the user has opted in.
+  if (active_behavior_->ShouldShowDefaultActionButtonsAfterRegionSelected()) {
+    if (IsSunfishFeatureEnabledWithFeatureKey()) {
+      RecordSearchButtonShown();
+      capture_mode_util::AddActionButton(
+          base::BindRepeating(&CaptureModeSession::OnSearchButtonPressed,
+                              weak_ptr_factory_.GetWeakPtr()),
+          u"Search with Lens", &kLensIcon,
+          ActionButtonRank(ActionButtonType::kSunfish, /*weight=*/1),
+          ActionButtonViewID::kSearchButton);
+    }
+  }
+
+  // TODO: crbug.com/375261308 - Prevent image search when the region stays the
+  // same or is within a throttling QPS after a release event.
+  // Notify the behavior that the region was selected or adjusted, in case it
+  // needs to do specific handling. Note `this` may be destroyed by
+  // `OnRegionSelectedOrAdjusted()`.
+  auto weak_ptr = weak_ptr_factory_.GetWeakPtr();
+  active_behavior_->OnRegionSelectedOrAdjusted();
+  if (!weak_ptr) {
     return;
   }
 
@@ -2670,8 +2691,6 @@
   is_selecting_region_ = false;
 
   UpdateCaptureLabelWidget(CaptureLabelAnimation::kRegionPhaseChange);
-  // Refresh the action container bounds after the capture label is updated.
-  UpdateActionContainerWidget();
 
   A11yAlertCaptureSource(/*trigger_now=*/true);
 }
@@ -2704,9 +2723,6 @@
   UpdateDimensionsLabelWidget(is_resizing);
   UpdateCaptureLabelWidget(CaptureLabelAnimation::kNone);
   UpdateActionContainerWidget();
-  if (ShowDefaultActionButtonsOrPerformSearch()) {
-    return;
-  }
   InvalidateImageSearch();
 }
 
@@ -3328,39 +3344,6 @@
   }
 }
 
-[[nodiscard]] bool
-CaptureModeSession::ShowDefaultActionButtonsOrPerformSearch() {
-  // Early exit if we can't show the action container, i.e. a drag is in
-  // progress or capture region is empty. This will be checked again if an
-  // asynchronous function invokes `AddActionButton()`.
-  if (!ShouldShowActionContainerWidget()) {
-    return false;
-  }
-
-  // `ShouldShowActionContainerWidget()` checks `IsSunfishAllowedAndEnabled()`
-  // which checks if *either* Scanner or Sunfish is enabled. Check again if
-  // Sunfish specifically is enabled to show the Search button.
-  if (active_behavior_->ShouldShowDefaultActionButtonsAfterRegionSelected() &&
-      IsSunfishFeatureEnabledWithFeatureKey()) {
-    RecordSearchButtonShown();
-    capture_mode_util::AddActionButton(
-        base::BindRepeating(&CaptureModeSession::OnSearchButtonPressed,
-                            weak_ptr_factory_.GetWeakPtr()),
-        u"Search with Lens", &kLensIcon,
-        ActionButtonRank(ActionButtonType::kSunfish, /*weight=*/1),
-        ActionButtonViewID::kSearchButton);
-  }
-  // TODO: crbug.com/375261308 - Prevent image search when the region stays the
-  // same or is within a throttling QPS after a release event.
-  // Notify the behavior that the region was selected or adjusted, in case it
-  // needs to do specific handling. Note `this` may be destroyed by
-  // `OnRegionSelectedOrAdjusted()`.
-  auto weak_ptr = weak_ptr_factory_.GetWeakPtr();
-  active_behavior_
-      ->OnRegionSelectedOrAdjusted();  // `this` may be deleted after this line.
-  return !weak_ptr;
-}
-
 void CaptureModeSession::UpdateFeedbackButtonWidget() {
   if (ShouldHideFeedbackWidget(feedback_button_widget_.get())) {
     if (feedback_button_widget_ && feedback_button_widget_->IsVisible()) {
@@ -3546,9 +3529,6 @@
 
   UpdateCaptureLabelWidget(CaptureLabelAnimation::kNone);
   UpdateActionContainerWidget();
-  if (ShowDefaultActionButtonsOrPerformSearch()) {
-    return;
-  }
   UpdateFeedbackButtonWidget();
 
   UpdateCursor(display::Screen::GetScreen()->GetCursorScreenPoint(),
diff --git a/ash/capture_mode/capture_mode_session.h b/ash/capture_mode/capture_mode_session.h
index f56e99f..f5670adc 100644
--- a/ash/capture_mode/capture_mode_session.h
+++ b/ash/capture_mode/capture_mode_session.h
@@ -436,11 +436,6 @@
   // `action_container_widget_` exists.
   void RemoveAllActionButtons();
 
-  // In default mode, shows the Search button and performs text detection. In
-  // sunfish mode, performs image search. This may end the session, in which
-  // case returns true if `this` was deleted.
-  [[nodiscard]] bool ShowDefaultActionButtonsOrPerformSearch();
-
   // Checks if the controller needs to show the disclaimer and shows if
   // necessary. `accept_callback` is run if disclaimer is accepted.
   // Takes a repeating closure because the button that triggers this (Smart
diff --git a/ash/capture_mode/sunfish_unittest.cc b/ash/capture_mode/sunfish_unittest.cc
index c731d00..a8b9e75 100644
--- a/ash/capture_mode/sunfish_unittest.cc
+++ b/ash/capture_mode/sunfish_unittest.cc
@@ -1711,9 +1711,15 @@
 }
 
 // Tests that the sunfish launcher nudge appears and closes properly in
-// clamshell mode.
+// clamshell mode, and that the prefs are updated properly.
 TEST_F(SunfishTest, ClamshellLauncherNudge) {
   AppListControllerImpl::SetSunfishNudgeDisabledForTest(false);
+
+  // The nudge shown count should start at zero.
+  auto* pref_service = capture_mode_util::GetActiveUserPrefService();
+  EXPECT_EQ(pref_service->GetInteger(prefs::kSunfishLauncherNudgeShownCount),
+            0);
+
   // Advance clock so we aren't at zero time.
   task_environment()->AdvanceClock(base::Hours(25));
 
@@ -1731,6 +1737,8 @@
       nudge_manager->GetNudgeIfShown(capture_mode::kSunfishLauncherNudgeId);
   ASSERT_TRUE(nudge);
   EXPECT_TRUE(nudge->GetVisible());
+  EXPECT_EQ(pref_service->GetInteger(prefs::kSunfishLauncherNudgeShownCount),
+            1);
 
   // Start the sunfish session using the launcher button. The nudge should
   // close.
@@ -1738,12 +1746,22 @@
   VerifyActiveBehavior(BehaviorType::kSunfish);
   EXPECT_FALSE(
       nudge_manager->GetNudgeIfShown(capture_mode::kSunfishLauncherNudgeId));
+
+  // Using the launcher button should set the nudge shown count to its limit.
+  EXPECT_EQ(pref_service->GetInteger(prefs::kSunfishLauncherNudgeShownCount),
+            capture_mode::kSunfishNudgeMaxShownCount);
 }
 
 // Tests that the sunfish launcher nudge appears and closes properly in
-// tablet mode.
+// tablet mode, and that the prefs are updated properly.
 TEST_F(SunfishTest, TabletLauncherNudge) {
   AppListControllerImpl::SetSunfishNudgeDisabledForTest(false);
+
+  // The nudge shown count should start at zero.
+  auto* pref_service = capture_mode_util::GetActiveUserPrefService();
+  EXPECT_EQ(pref_service->GetInteger(prefs::kSunfishLauncherNudgeShownCount),
+            0);
+
   // Advance clock so we aren't at zero time.
   task_environment()->AdvanceClock(base::Hours(25));
 
@@ -1762,6 +1780,8 @@
       nudge_manager->GetNudgeIfShown(capture_mode::kSunfishLauncherNudgeId);
   ASSERT_TRUE(nudge);
   EXPECT_TRUE(nudge->GetVisible());
+  EXPECT_EQ(pref_service->GetInteger(prefs::kSunfishLauncherNudgeShownCount),
+            1);
 
   // Start the sunfish session using the launcher button. The nudge should
   // close.
@@ -1769,6 +1789,10 @@
   VerifyActiveBehavior(BehaviorType::kSunfish);
   EXPECT_FALSE(
       nudge_manager->GetNudgeIfShown(capture_mode::kSunfishLauncherNudgeId));
+
+  // Using the launcher button should set the nudge shown count to its limit.
+  EXPECT_EQ(pref_service->GetInteger(prefs::kSunfishLauncherNudgeShownCount),
+            capture_mode::kSunfishNudgeMaxShownCount);
 }
 
 // Tests that the sunfish nudge only appears three times at most, with at least
@@ -2009,43 +2033,6 @@
             session_test_api.GetCurrentFocusGroup());
 }
 
-// Tests that restarting default mode within a short time will re-show the
-// default action buttons.
-TEST_F(SunfishTest, RestartDefaultModeReShowsActionButton) {
-  // Start default mode and select a region.
-  auto* controller =
-      StartCaptureSession(CaptureModeSource::kRegion, CaptureModeType::kImage);
-  VerifyActiveBehavior(BehaviorType::kDefault);
-  const gfx::Rect region(0, 0, 50, 200);
-  SelectCaptureModeRegion(GetEventGenerator(), region,
-                          /*release_mouse=*/true, /*verify_region=*/true);
-
-  // Test the Search button is shown.
-  auto* search_button =
-      CaptureModeSessionTestApi(controller->capture_mode_session())
-          .GetButtonWithViewID(ActionButtonViewID::kSearchButton);
-  ASSERT_TRUE(search_button);
-  EXPECT_TRUE(search_button->GetVisible());
-
-  // Exit then re-enter capture mode session.
-  controller->Stop();
-  ASSERT_FALSE(controller->IsActive());
-
-  StartCaptureSession(CaptureModeSource::kRegion, CaptureModeType::kImage);
-  VerifyActiveBehavior(BehaviorType::kDefault);
-
-  // Test the Capture and Search buttons are both shown.
-  CaptureModeSessionTestApi session_test_api(
-      controller->capture_mode_session());
-  auto* capture_button =
-      session_test_api.GetCaptureLabelView()->capture_button_container();
-  ASSERT_TRUE(capture_button->GetVisible());
-  search_button =
-      session_test_api.GetButtonWithViewID(ActionButtonViewID::kSearchButton);
-  ASSERT_TRUE(search_button);
-  EXPECT_TRUE(search_button->GetVisible());
-}
-
 class ScannerTest : public AshTestBase {
  public:
   ScannerTest()
@@ -2488,54 +2475,6 @@
   EXPECT_TRUE(ToastManager::Get()->IsToastShown(kCaptureModeTextCopiedToastId));
 }
 
-// Tests that restarting default mode within a short time will re-show the
-// Copy Text button.
-TEST_F(ScannerTest, RestartDefaultModeReshowsCopyTextButton) {
-  // Select a capture region with text.
-  auto* controller =
-      StartCaptureSession(CaptureModeSource::kRegion, CaptureModeType::kImage);
-  base::test::TestFuture<OnTextDetectionComplete> detect_text_future_1;
-  auto* test_delegate =
-      static_cast<TestCaptureModeDelegate*>(controller->delegate_for_testing());
-  EXPECT_CALL(*test_delegate, DetectTextInImage)
-      .WillOnce(WithArg<1>(InvokeFuture(detect_text_future_1)));
-
-  const gfx::Rect capture_region(0, 0, 50, 200);
-  SelectCaptureModeRegion(GetEventGenerator(), capture_region,
-                          /*release_mouse=*/true, /*verify_region=*/true);
-  detect_text_future_1.Take().Run("detected text");
-
-  // Copy text button should have been created.
-  ActionButtonView* copy_text_button =
-      CaptureModeSessionTestApi(controller->capture_mode_session())
-          .GetButtonWithViewID(ActionButtonViewID::kCopyTextButton);
-  ASSERT_TRUE(copy_text_button);
-
-  // Exit then re-enter capture mode session.
-  controller->Stop();
-  ASSERT_FALSE(controller->IsActive());
-
-  // Re-enter capture mode session. Test it runs text detection.
-  base::test::TestFuture<OnTextDetectionComplete> detect_text_future_2;
-  EXPECT_CALL(*test_delegate, DetectTextInImage)
-      .WillOnce(WithArg<1>(InvokeFuture(detect_text_future_2)));
-
-  StartCaptureSession(CaptureModeSource::kRegion, CaptureModeType::kImage);
-  VerifyActiveBehavior(BehaviorType::kDefault);
-  ASSERT_EQ(capture_region, controller->user_capture_region());
-  detect_text_future_2.Take().Run("detected text");
-
-  // Test the Capture button and Copy Text button are both created.
-  CaptureModeSessionTestApi session_test_api(
-      controller->capture_mode_session());
-  auto* capture_button =
-      session_test_api.GetCaptureLabelView()->capture_button_container();
-  ASSERT_TRUE(capture_button->GetVisible());
-  copy_text_button =
-      session_test_api.GetButtonWithViewID(ActionButtonViewID::kCopyTextButton);
-  ASSERT_TRUE(copy_text_button);
-}
-
 // Tests that the copy text button is not shown in default capture mode if no
 // text is detected in the selected region.
 TEST_F(ScannerTest, NoCopyTextButtonIfNoDetectedText) {
@@ -3045,20 +2984,8 @@
   controller->Stop();
   ASSERT_FALSE(controller->IsActive());
 
-  // Re-enter the session. The disclaimer will be re-shown. Note text detection
-  // will start immediately as the captured region is preserved from the last
-  // session.
-  StartCaptureSession(CaptureModeSource::kRegion, CaptureModeType::kImage);
-  base::test::TestFuture<OnTextDetectionComplete> detect_text_future;
-  auto* test_delegate =
-      static_cast<TestCaptureModeDelegate*>(controller->delegate_for_testing());
-  EXPECT_CALL(*test_delegate, DetectTextInImage)
-      .WillOnce(WithArg<1>(InvokeFuture(detect_text_future)));
-  detect_text_future.Take().Run("detected text");
-
-  smart_actions_button =
-      CaptureModeSessionTestApi(controller->capture_mode_session())
-          .GetButtonWithViewID(ActionButtonViewID::kSmartActionsButton);
+  // Re-enter the session. The disclaimer will be re-shown.
+  smart_actions_button = GetSmartActionsButton();
   ASSERT_TRUE(smart_actions_button);
   LeftClickOn(smart_actions_button);
   EXPECT_TRUE(CaptureModeSessionTestApi(controller->capture_mode_session())
diff --git a/ash/constants/ash_pref_names.h b/ash/constants/ash_pref_names.h
index 15ef920..a53459a 100644
--- a/ash/constants/ash_pref_names.h
+++ b/ash/constants/ash_pref_names.h
@@ -87,6 +87,11 @@
 inline constexpr char kHMRConsentWindowDismissCount[] =
     "settings.hmr.consent_window_dismiss_count";
 
+// An integer pref used by an admin policy to control the settings of
+// Gen AI Photo Editing. See the policy at GenAIPhotoEditingSettings.yaml.
+inline constexpr char kGenAIPhotoEditingSettings[] =
+    "ash.gen_ai_photo_editing_settings";
+
 // A boolean pref of whether Lobster is enabled.
 inline constexpr char kLobsterEnabled[] = "settings.lobster_enabled";
 
diff --git a/ash/constants/ash_switches.cc b/ash/constants/ash_switches.cc
index a5b9bc2..62b32d2 100644
--- a/ash/constants/ash_switches.cc
+++ b/ash/constants/ash_switches.cc
@@ -777,55 +777,6 @@
 const char kKioskSplashScreenMinTimeSeconds[] =
     "kiosk-splash-screen-min-time-seconds";
 
-// If this switch is set, then ash-chrome will exec the lacros-chrome binary
-// from the indicated path rather than from component updater. Note that the
-// path should be to a directory that contains a binary named 'chrome'.
-const char kLacrosChromePath[] = "lacros-chrome-path";
-
-// If set, it passes the ids of additional extensions allowed to run in
-// both ash and lacros when lacros is enabled. The ids are separated by ",".
-// This should only used for testing.
-// Note: The ids passed to this switch and the ids passed to
-// kExtensionsRunInAshOnly should be mutually exclusive, i.e., without overlaps.
-// If any extension passed to this switch are to be published to app service,
-// it must be listed in one of the app service block switches so that
-// it won't be published to app service in both ash and lacros. Currently,
-// we don't have any use case with an extension running in both ash and lacros
-// to be published to app service, therefore, we haven't defined the app service
-// block switch for extensions.
-const char kExtensionsRunInBothAshAndLacros[] =
-    "extensions-run-in-ash-and-lacros";
-
-// If set, it passes the ids of additional extension apps allowed to run in
-// in both ash and lacros when lacros is enabled. The ids are separated by ",".
-// This should only used for testing.
-// Note: The ids passed to this switch and the ids passed to
-// kExtensionAppsRunInAshOnly should be mutually exclusive, i.e., without
-// overlaps. If any extension app passed to this switch are to be publisedh to
-// app service, it must be listed in one of the app service block switches so
-// that it won't be published to app service in both ash and lacros. Currently,
-// we only have the use case of an extension app running in both ash and lacros
-// to be published to app service in lacros only, therefore, we only add the
-// kExtensionAppsBlockForAppServiceInAsh switch.
-const char kExtensionAppsRunInBothAshAndLacros[] =
-    "extension-apps-run-in-ash-and-lacros";
-
-// If set, it passes the ids of the additional extensions allowed to run in
-// ash only when lacros is enabled. The ids are separated by ",".
-// This should only used for testing.
-const char kExtensionsRunInAshOnly[] = "extensions-run-in-ash-only";
-
-// If set, it passes the ids of the additional extension apps allowed to run in
-// ash only when lacros is enabled. The ids are separated by ",".
-// This should only used for testing.
-const char kExtensionAppsRunInAshOnly[] = "extension-apps-run-in-ash-only";
-
-// If set, it passes the ids of the extension apps blocked for app service
-// in ash when lacros is enabled. The ids are separated by ",".
-// This should only used for testing.
-const char kExtensionAppsBlockForAppServiceInAsh[] =
-    "extension-apps-block-for-app-service-in-ash";
-
 // Start Chrome in RMA mode. Launches RMA app automatically.
 // kRmaNotAllowed switch takes priority over this one.
 const char kLaunchRma[] = "launch-rma";
@@ -846,15 +797,6 @@
 // Specifies the user which is already logged in.
 const char kLoginUser[] = "login-user";
 
-// This flag is set if lacros is not allowed. Specifically this flag is set if
-// there are more than two signed in users i.e. inside multi-user session.
-const char kDisallowLacros[] = "disallow-lacros";
-
-// This flag disables "disallow-lacros" above, if both are set together.
-// I.e., if user flips feature flag, or policy is set, lacros can be
-// used, event if --disallow-lacros is set.
-const char kDisableDisallowLacros[] = "disable-disallow-lacros";
-
 // Supply secret key for the sparky feature.
 const char kSparkyFeatureKey[] = "sparky-feature-key";
 
diff --git a/ash/constants/ash_switches.h b/ash/constants/ash_switches.h
index 2460071..929aac88 100644
--- a/ash/constants/ash_switches.h
+++ b/ash/constants/ash_switches.h
@@ -251,24 +251,11 @@
 extern const char kInstallLogFastUploadForTests[];
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const char kKioskSplashScreenMinTimeSeconds[];
-COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kLacrosChromePath[];
-COMPONENT_EXPORT(ASH_CONSTANTS)
-extern const char kExtensionsRunInBothAshAndLacros[];
-COMPONENT_EXPORT(ASH_CONSTANTS)
-extern const char kExtensionAppsRunInBothAshAndLacros[];
-COMPONENT_EXPORT(ASH_CONSTANTS)
-extern const char kExtensionsRunInAshOnly[];
-COMPONENT_EXPORT(ASH_CONSTANTS)
-extern const char kExtensionAppsRunInAshOnly[];
-COMPONENT_EXPORT(ASH_CONSTANTS)
-extern const char kExtensionAppsBlockForAppServiceInAsh[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kLaunchRma[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kLobsterFeatureKey[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kLoginManager[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kLoginProfile[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kLoginUser[];
-COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDisallowLacros[];
-COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDisableDisallowLacros[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kSparkyFeatureKey[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kSparkyServerUrl[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kSunfishFeatureKey[];
diff --git a/ash/display/cursor_window_controller.cc b/ash/display/cursor_window_controller.cc
index 3dfb91b..2bd4dff 100644
--- a/ash/display/cursor_window_controller.cc
+++ b/ash/display/cursor_window_controller.cc
@@ -159,7 +159,7 @@
 
   // aura::WindowDelegate overrides:
   gfx::Size GetMinimumSize() const override { return size_; }
-  gfx::Size GetMaximumSize() const override { return size_; }
+  std::optional<gfx::Size> GetMaximumSize() const override { return size_; }
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override {}
   gfx::NativeCursor GetCursor(const gfx::Point& point) override {
diff --git a/ash/drag_drop/drag_drop_tracker.cc b/ash/drag_drop/drag_drop_tracker.cc
index 07c7e81..4c051a0 100644
--- a/ash/drag_drop/drag_drop_tracker.cc
+++ b/ash/drag_drop/drag_drop_tracker.cc
@@ -32,7 +32,9 @@
 
   // Overridden from WindowDelegate:
   gfx::Size GetMinimumSize() const override { return gfx::Size(); }
-  gfx::Size GetMaximumSize() const override { return gfx::Size(); }
+  std::optional<gfx::Size> GetMaximumSize() const override {
+    return gfx::Size();
+  }
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override {}
   gfx::NativeCursor GetCursor(const gfx::Point& point) override {
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_surface_impl.cc b/ash/public/cpp/external_arc/message_center/arc_notification_surface_impl.cc
index c4168dd44..2c38bd36 100644
--- a/ash/public/cpp/external_arc/message_center/arc_notification_surface_impl.cc
+++ b/ash/public/cpp/external_arc/message_center/arc_notification_surface_impl.cc
@@ -34,7 +34,9 @@
 
   // Overridden from aura::WindowDelegate:
   gfx::Size GetMinimumSize() const override { return gfx::Size(); }
-  gfx::Size GetMaximumSize() const override { return gfx::Size(); }
+  std::optional<gfx::Size> GetMaximumSize() const override {
+    return gfx::Size();
+  }
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override {}
   gfx::NativeCursor GetCursor(const gfx::Point& point) override {
diff --git a/ash/system/diagnostics/mojom/input.mojom b/ash/system/diagnostics/mojom/input.mojom
index 29abd31a..7760fbf 100644
--- a/ash/system/diagnostics/mojom/input.mojom
+++ b/ash/system/diagnostics/mojom/input.mojom
@@ -62,6 +62,8 @@
 };
 
 // Note that this enumeration will need to be extended if new keys are added.
+//
+// NextMinVersion: 2
 [Stable, Extensible]
 enum TopRowKey {
   // This is required for backwards compatibility, should not be used.
@@ -91,6 +93,8 @@
   kPlayPause,
   kScreenMirror,
   kDelete,
+  [MinVersion=1] kAccessibility,
+  [MinVersion=1] kDictation,
 };
 
 [Stable, Extensible]
@@ -103,7 +107,38 @@
   kControlPanel,
 };
 
+[Stable, Extensible]
+enum BottomLeftLayout {
+  [Default] kUnknown,
+  // The bottom left is consist of ctrl, fn and alt.
+  kBottomLeft3Keys,
+  // The bottom left is consist of ctrl, fn, search and alt.
+  kBottomLeft4Keys,
+};
+
+[Stable, Extensible]
+enum BottomRightLayout {
+  [Default] kUnknown,
+  // The bottom right is consist of alt and ctrl.
+  kBottomRight2Keys,
+  // The bottom right is consist of alt, fn and ctrl.
+  kBottomRight3Keys,
+  // The bottom right is consist of alt, fn, globe and ctrl.
+  kBottomRight4Keys,
+};
+
+[Stable, Extensible]
+enum NumpadLayout {
+  [Default] kUnknown,
+  // The numpad has 3 columns in total.
+  kNumpad3Column,
+  // The numpad has 4 columns in total.
+  kNumpad4Column,
+};
+
 // Describes a connected keyboard.
+//
+// NextMinVersion: 2
 [Stable]
 struct KeyboardInfo {
   // The number of the keyboard's /dev/input/event* node.
@@ -126,6 +161,18 @@
   TopRightKey top_right_key@8;
   // Only applicable to CrOS keyboards.
   bool has_assistant_key@9;
+  // Specify the layout of the bottom left keys (fn, etc.) Only required for
+  // split modifier keyboards.
+  [MinVersion=1]
+  BottomLeftLayout bottom_left_layout@10;
+  // Specify the layout of the bottom right keys (fn, etc.) Only required for
+  // split modifier keyboards.
+  [MinVersion=1]
+  BottomRightLayout bottom_right_layout@11;
+  [MinVersion=1]
+  // Specify the layout of the numpad. Only required for split modifier
+  // keyboards that has a numpad.
+  NumpadLayout numpad_layout@12;
 };
 
 // Keyboard diagnostics event info. It is fired when users completed a keyboard
diff --git a/ash/webui/diagnostics_ui/resources/fake_data.ts b/ash/webui/diagnostics_ui/resources/fake_data.ts
index 032f7aa..e852b22 100644
--- a/ash/webui/diagnostics_ui/resources/fake_data.ts
+++ b/ash/webui/diagnostics_ui/resources/fake_data.ts
@@ -5,7 +5,7 @@
 import {stringToMojoString16} from 'chrome://resources/js/mojo_type_util.js';
 
 import {CellularNetwork, EthernetNetwork, NetworkGuidInfo, WiFiNetwork} from './diagnostics_types.js';
-import {ConnectionType, KeyboardInfo, MechanicalLayout, NumberPadPresence, PhysicalLayout, TopRightKey, TopRowKey} from './input.mojom-webui.js';
+import {BottomLeftLayout, BottomRightLayout, ConnectionType, KeyboardInfo, MechanicalLayout, NumberPadPresence, NumpadLayout, PhysicalLayout, TopRightKey, TopRowKey} from './input.mojom-webui.js';
 import {TouchDeviceInfo, TouchDeviceType} from './input_data_provider.mojom-webui.js';
 import {AuthenticationType, LockType, NetworkState, NetworkType, RoamingState, SecurityType, WiFiStateProperties} from './network_health_provider.mojom-webui.js';
 import {BatteryChargeStatus, BatteryHealth, BatteryInfo, BatteryState, CpuUsage, ExternalPowerSource, MemoryUsage, SystemInfo} from './system_data_provider.mojom-webui.js';
@@ -606,6 +606,9 @@
     ],
     topRightKey: TopRightKey.kPower,
     numberPadPresent: NumberPadPresence.kPresent,
+    bottomLeftLayout: BottomLeftLayout.kUnknown,
+    bottomRightLayout: BottomRightLayout.kUnknown,
+    numpadLayout: NumpadLayout.kUnknown,
   },
 ];
 
diff --git a/ash/webui/media_app_ui/BUILD.gn b/ash/webui/media_app_ui/BUILD.gn
index 28efa01..8e6c0cc 100644
--- a/ash/webui/media_app_ui/BUILD.gn
+++ b/ash/webui/media_app_ui/BUILD.gn
@@ -42,6 +42,7 @@
     "//chromeos/ash/components/mantis/media_app",
     "//chromeos/constants",
     "//chromeos/strings",
+    "//components/prefs",
     "//content/public/browser",
     "//content/public/common",
     "//mojo/public/cpp/bindings",
diff --git a/ash/webui/media_app_ui/media_app_guest_ui.cc b/ash/webui/media_app_ui/media_app_guest_ui.cc
index c2f0e17..315e105 100644
--- a/ash/webui/media_app_ui/media_app_guest_ui.cc
+++ b/ash/webui/media_app_ui/media_app_guest_ui.cc
@@ -313,6 +313,7 @@
         std::make_unique<MantisUntrustedServiceManager>();
   }
   mantis_untrusted_service_manager_->IsAvailable(
+      delegate_->GetPrefService(web_ui()),
       base::BindOnce(&MediaAppGuestUI::OnMantisAvailableDone,
                      weak_factory_.GetWeakPtr(), std::move(callback)));
 }
diff --git a/ash/webui/media_app_ui/media_app_guest_ui.h b/ash/webui/media_app_ui/media_app_guest_ui.h
index 8d192e81..bdc7061 100644
--- a/ash/webui/media_app_ui/media_app_guest_ui.h
+++ b/ash/webui/media_app_ui/media_app_guest_ui.h
@@ -12,6 +12,7 @@
 #include "base/files/file_path.h"
 #include "base/task/sequenced_task_runner.h"
 #include "chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager.h"
+#include "components/prefs/pref_service.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "ui/gfx/native_widget_types.h"
@@ -33,6 +34,7 @@
   // Takes a WebUI and WebUIDataSource, and populates its load-time data.
   virtual void PopulateLoadTimeData(content::WebUI* web_ui,
                                     content::WebUIDataSource* source) = 0;
+  virtual PrefService* GetPrefService(content::WebUI* web_ui) = 0;
   virtual void CreateAndBindOcrUntrustedService(
       content::BrowserContext& context,
       gfx::NativeWindow native_window,
diff --git a/ash/wm/default_state.cc b/ash/wm/default_state.cc
index e9180a1..6be344a 100644
--- a/ash/wm/default_state.cc
+++ b/ash/wm/default_state.cc
@@ -53,8 +53,9 @@
     "Ash.Window.Snap.DeviceOrientation";
 
 gfx::Size GetWindowMaximumSize(aura::Window* window) {
-  return window->delegate() ? window->delegate()->GetMaximumSize()
-                            : gfx::Size();
+  return window->delegate()
+             ? window->delegate()->GetMaximumSize().value_or(gfx::Size())
+             : gfx::Size();
 }
 
 // Moves the window to the specified display if necessary.
diff --git a/ash/wm/pip/pip_controller.cc b/ash/wm/pip/pip_controller.cc
index 440383d..4174dc0 100644
--- a/ash/wm/pip/pip_controller.cc
+++ b/ash/wm/pip/pip_controller.cc
@@ -38,7 +38,8 @@
 // ratio of the PiP window.
 gfx::Size PreserveAspectRatio(aura::Window* pip_window,
                               const gfx::Size& buffer_size) {
-  gfx::Size max_size = pip_window->delegate()->GetMaximumSize();
+  gfx::Size max_size =
+      pip_window->delegate()->GetMaximumSize().value_or(gfx::Size());
   gfx::Size min_size = pip_window->delegate()->GetMinimumSize();
   gfx::Size buffer_size_clone = buffer_size;
 
@@ -59,7 +60,9 @@
 
 gfx::Size GetMaxSize(WindowState* pip_window_state) {
   // Calculates the max size of the PiP window preserving the aspect ratio.
-  gfx::Size max_size = pip_window_state->window()->delegate()->GetMaximumSize();
+  gfx::Size max_size =
+      pip_window_state->window()->delegate()->GetMaximumSize().value_or(
+          gfx::Size());
   return PreserveAspectRatio(pip_window_state->window(), max_size);
 }
 
@@ -195,7 +198,8 @@
   if (!pip_window_) {
     return false;
   }
-  gfx::Size max_size = pip_window_->delegate()->GetMaximumSize();
+  gfx::Size max_size =
+      pip_window_->delegate()->GetMaximumSize().value_or(gfx::Size());
   gfx::Size min_size = pip_window_->delegate()->GetMinimumSize();
   return !max_size.IsEmpty() && !min_size.IsEmpty() &&
          max_size.width() > min_size.width() &&
diff --git a/ash/wm/tablet_mode/tablet_mode_window_state.cc b/ash/wm/tablet_mode/tablet_mode_window_state.cc
index 9e47070f..6431f02e 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_state.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_state.cc
@@ -70,9 +70,11 @@
       screen_util::GetMaximizedWindowBoundsInParent(window_state->window())
           .size();
 
-  gfx::Size size = window_state->window()->delegate()
-                       ? window_state->window()->delegate()->GetMaximumSize()
-                       : gfx::Size();
+  gfx::Size size =
+      window_state->window()->delegate()
+          ? window_state->window()->delegate()->GetMaximumSize().value_or(
+                gfx::Size())
+          : gfx::Size();
   if (size.IsEmpty())
     return workspace_size;
 
diff --git a/ash/wm/window_animations.cc b/ash/wm/window_animations.cc
index fa2c170..d0e2ae5 100644
--- a/ash/wm/window_animations.cc
+++ b/ash/wm/window_animations.cc
@@ -530,7 +530,7 @@
   ui::AnimationThroughputReporter reporter(
       settings.GetAnimator(),
       metrics_util::ForSmoothnessV3(
-          base::BindRepeating(static_cast<void (*)(const char*, int)>(
+          base::BindRepeating(static_cast<void (*)(std::string_view, int)>(
                                   &base::UmaHistogramPercentage),
                               "Ash.Window.AnimationSmoothness.Unminimize")));
   base::TimeDelta duration =
@@ -551,7 +551,7 @@
   ui::AnimationThroughputReporter reporter(
       hiding_settings.layer_animation_settings()->GetAnimator(),
       metrics_util::ForSmoothnessV3(
-          base::BindRepeating(static_cast<void (*)(const char*, int)>(
+          base::BindRepeating(static_cast<void (*)(std::string_view, int)>(
                                   &base::UmaHistogramPercentage),
                               "Ash.Window.AnimationSmoothness.Minimize")));
 
diff --git a/ash/wm/window_resizer.cc b/ash/wm/window_resizer.cc
index b9e6719..ac149e83 100644
--- a/ash/wm/window_resizer.cc
+++ b/ash/wm/window_resizer.cc
@@ -453,9 +453,10 @@
                         ->GetDisplayNearestWindow(GetTarget())
                         .bounds()
                         .width();
-    gfx::Size max_size = GetTarget()->delegate()
-                             ? GetTarget()->delegate()->GetMaximumSize()
-                             : gfx::Size();
+    gfx::Size max_size =
+        GetTarget()->delegate()
+            ? GetTarget()->delegate()->GetMaximumSize().value_or(gfx::Size())
+            : gfx::Size();
     if (max_size.width() != 0)
       max_width = std::min(max_width, max_size.width());
     if (width > max_width) {
@@ -487,9 +488,10 @@
                          ->GetDisplayNearestWindow(GetTarget())
                          .bounds()
                          .height();
-    gfx::Size max_size = GetTarget()->delegate()
-                             ? GetTarget()->delegate()->GetMaximumSize()
-                             : gfx::Size();
+    gfx::Size max_size =
+        GetTarget()->delegate()
+            ? GetTarget()->delegate()->GetMaximumSize().value_or(gfx::Size())
+            : gfx::Size();
     if (max_size.height() != 0)
       max_height = std::min(max_height, max_size.height());
     if (height > max_height) {
@@ -506,9 +508,10 @@
   gfx::Size min_size = GetTarget()->delegate()
                            ? GetTarget()->delegate()->GetMinimumSize()
                            : gfx::Size();
-  gfx::Size max_size = GetTarget()->delegate()
-                           ? GetTarget()->delegate()->GetMaximumSize()
-                           : gfx::Size();
+  gfx::Size max_size =
+      GetTarget()->delegate()
+          ? GetTarget()->delegate()->GetMaximumSize().value_or(gfx::Size())
+          : gfx::Size();
   DCHECK(!min_size.IsEmpty());
 
   // gfx::SizeRectToAspectRatio expects std::nullopt when there is no limit, but
diff --git a/ash/wm/window_state.cc b/ash/wm/window_state.cc
index 6fd76b08..1968c52 100644
--- a/ash/wm/window_state.cc
+++ b/ash/wm/window_state.cc
@@ -997,9 +997,10 @@
     gfx::Size min_size = window_->delegate()
                              ? window_->delegate()->GetMinimumSize()
                              : gfx::Size();
-    gfx::Size max_size = window_->delegate()
-                             ? window_->delegate()->GetMaximumSize()
-                             : gfx::Size();
+    gfx::Size max_size =
+        window_->delegate()
+            ? window_->delegate()->GetMaximumSize().value_or(gfx::Size())
+            : gfx::Size();
     const display::Display display =
         display::Screen::GetScreen()->GetDisplayNearestWindow(window_);
     min_size.SetToMin(display.work_area().size());
diff --git a/ash/wm/workspace/workspace_event_handler.cc b/ash/wm/workspace/workspace_event_handler.cc
index a2baad1b3..18e8579 100644
--- a/ash/wm/workspace/workspace_event_handler.cc
+++ b/ash/wm/workspace/workspace_event_handler.cc
@@ -151,7 +151,9 @@
         // it would be rather inappropriate to end overview as below, and of
         // course it would be blatantly inappropriate to make the following call
         // to |OverviewSession::SetWindowListNotAnimatedWhenExiting|.
-        DCHECK_EQ(gfx::Size(), target->delegate()->GetMaximumSize());
+        std::optional<gfx::Size> max_size =
+            target->delegate()->GetMaximumSize();
+        DCHECK(!max_size.has_value() || max_size.value() == gfx::Size());
         overview_controller->overview_session()
             ->SetWindowListNotAnimatedWhenExiting(target->GetRootWindow());
         overview_controller->EndOverview(OverviewEndAction::kSplitView);
diff --git a/ash/wm/workspace/workspace_window_resizer.cc b/ash/wm/workspace/workspace_window_resizer.cc
index a164dd3..cdf17729 100644
--- a/ash/wm/workspace/workspace_window_resizer.cc
+++ b/ash/wm/workspace/workspace_window_resizer.cc
@@ -1301,7 +1301,9 @@
     int min = PrimaryAxisSize(
         window_delegate ? window_delegate->GetMinimumSize() : gfx::Size());
     int max = PrimaryAxisSize(
-        window_delegate ? window_delegate->GetMaximumSize() : gfx::Size());
+        window_delegate
+            ? window_delegate->GetMaximumSize().value_or(gfx::Size())
+            : gfx::Size());
 
     sizes->push_back(WindowSize(initial_size, min, max));
   }
diff --git a/base/BUILD.gn b/base/BUILD.gn
index f00dc67..8ea4d54 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -375,7 +375,6 @@
     "memory/raw_ptr_cast.h",
     "memory/raw_ptr_exclusion.h",
     "memory/raw_ref.h",
-    "memory/raw_scoped_refptr_mismatch_checker.h",
     "memory/raw_span.h",
     "memory/read_only_shared_memory_region.cc",
     "memory/read_only_shared_memory_region.h",
diff --git a/base/allocator/partition_alloc_features.cc b/base/allocator/partition_alloc_features.cc
index 5fa4cf7d6..a498cff 100644
--- a/base/allocator/partition_alloc_features.cc
+++ b/base/allocator/partition_alloc_features.cc
@@ -187,6 +187,8 @@
 const base::FeatureParam<BackupRefPtrMode> kBackupRefPtrModeParam{
     &kPartitionAllocBackupRefPtr, "brp-mode", BackupRefPtrMode::kEnabled,
     &kBackupRefPtrModeOptions};
+const base::FeatureParam<int> kBackupRefPtrExtraExtrasSizeParam{
+    &kPartitionAllocBackupRefPtr, "brp-extra-extras-size", 0};
 
 BASE_FEATURE(kPartitionAllocMemoryTagging,
              "PartitionAllocMemoryTagging",
diff --git a/base/allocator/partition_alloc_features.h b/base/allocator/partition_alloc_features.h
index 619392d..5a4c4f2 100644
--- a/base/allocator/partition_alloc_features.h
+++ b/base/allocator/partition_alloc_features.h
@@ -143,6 +143,8 @@
     kBackupRefPtrEnabledProcessesParam;
 extern const BASE_EXPORT base::FeatureParam<BackupRefPtrMode>
     kBackupRefPtrModeParam;
+extern const BASE_EXPORT base::FeatureParam<int>
+    kBackupRefPtrExtraExtrasSizeParam;
 BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocMemoryTagging);
 extern const BASE_EXPORT base::FeatureParam<MemtagMode> kMemtagModeParam;
 extern const BASE_EXPORT base::FeatureParam<RetagMode> kRetagModeParam;
diff --git a/base/allocator/partition_alloc_support.cc b/base/allocator/partition_alloc_support.cc
index 878a9f5c..b5839e7c 100644
--- a/base/allocator/partition_alloc_support.cc
+++ b/base/allocator/partition_alloc_support.cc
@@ -907,9 +907,16 @@
       false;
 #endif
 
+  size_t extra_extras_size = 0;
+  if (enable_brp) {
+    extra_extras_size = static_cast<size_t>(
+        base::features::kBackupRefPtrExtraExtrasSizeParam.Get());
+  }
+
   return {
       enable_brp,
       process_affected_by_brp_flag,
+      extra_extras_size,
   };
 }
 
@@ -1154,6 +1161,7 @@
 
   allocator_shim::ConfigurePartitions(
       allocator_shim::EnableBrp(brp_config.enable_brp),
+      brp_config.extra_extras_size,
       allocator_shim::EnableMemoryTagging(enable_memory_tagging),
       memory_tagging_reporting_mode, bucket_distribution,
       allocator_shim::SchedulerLoopQuarantine(scheduler_loop_quarantine),
@@ -1307,7 +1315,8 @@
   if (ShouldEnableShadowMetadata(process_type)) {
     partition_alloc::PartitionRoot::EnableShadowMetadata(
         partition_alloc::internal::PoolHandleMask::kRegular |
-        partition_alloc::internal::PoolHandleMask::kBRP);
+        partition_alloc::internal::PoolHandleMask::kBRP |
+        partition_alloc::internal::PoolHandleMask::kConfigurable);
   }
 #endif  // PA_CONFIG(ENABLE_SHADOW_METADATA)
 }
diff --git a/base/allocator/partition_alloc_support.h b/base/allocator/partition_alloc_support.h
index 0fa5baec..b4c5dc5 100644
--- a/base/allocator/partition_alloc_support.h
+++ b/base/allocator/partition_alloc_support.h
@@ -50,6 +50,9 @@
   struct BrpConfiguration {
     bool enable_brp = false;
     bool process_affected_by_brp_flag = false;
+
+    // TODO(https://crbug.com/371135823): Remove after the investigation.
+    size_t extra_extras_size = 0;
   };
 
   // Reconfigure* functions re-configure PartitionAlloc. It is impossible to
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
index d2f222c73..9578178 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
@@ -1218,6 +1218,7 @@
     if (brp_enabled()) {
       settings.in_slot_metadata_size = internal::kInSlotMetadataSizeAdjustment;
       settings.extras_size += internal::kInSlotMetadataSizeAdjustment;
+      settings.extras_size += opts.backup_ref_ptr_extra_extras_size;
 #if PA_CONFIG(MAYBE_ENABLE_MAC11_MALLOC_SIZE_HACK)
       EnableMac11MallocSizeHackIfNeeded();
 #endif
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_root.h b/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
index 9b8b324..b65c017d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
@@ -169,6 +169,9 @@
   EnableToggle backup_ref_ptr = kDisabled;
   AllowToggle use_configurable_pool = kDisallowed;
 
+  // TODO(https://crbug.com/371135823): Remove after the investigation.
+  size_t backup_ref_ptr_extra_extras_size = 0;
+
   EnableToggle scheduler_loop_quarantine = kDisabled;
   size_t scheduler_loop_quarantine_branch_capacity_in_bytes = 0;
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h
index fbe2f84..93bdda2 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h
@@ -1066,51 +1066,32 @@
 #endif
 
 template <typename T>
-struct IsRawPtr : std::false_type {};
-
+inline constexpr bool IsRawPtr = false;
 template <typename T, RawPtrTraits Traits>
-struct IsRawPtr<raw_ptr<T, Traits>> : std::true_type {};
+inline constexpr bool IsRawPtr<raw_ptr<T, Traits>> = true;
 
 template <typename T>
-inline constexpr bool IsRawPtrV = IsRawPtr<T>::value;
-
-template <typename T>
-inline constexpr bool IsRawPtrMayDangleV = false;
-
+inline constexpr bool IsRawPtrMayDangle = false;
 template <typename T, RawPtrTraits Traits>
-inline constexpr bool IsRawPtrMayDangleV<raw_ptr<T, Traits>> =
+inline constexpr bool IsRawPtrMayDangle<raw_ptr<T, Traits>> =
     partition_alloc::internal::ContainsFlags(Traits, RawPtrTraits::kMayDangle);
 
-// Template helpers for working with T* or raw_ptr<T>.
 template <typename T>
-struct IsRawPointerHelper : std::false_type {};
-
-template <typename T>
-struct IsRawPointerHelper<T*> : std::true_type {};
-
+inline constexpr bool IsPointerOrRawPtr = std::is_pointer_v<T>;
 template <typename T, RawPtrTraits Traits>
-struct IsRawPointerHelper<raw_ptr<T, Traits>> : std::true_type {};
+inline constexpr bool IsPointerOrRawPtr<raw_ptr<T, Traits>> = true;
 
+// Like `std::remove_pointer_t<>`, but also converts `raw_ptr<T>` => `T`.
 template <typename T>
-inline constexpr bool IsRawPointer = IsRawPointerHelper<T>::value;
-
-template <typename T>
-struct RemoveRawPointer {
-  using type = T;
+struct RemovePointer {
+  using type = std::remove_pointer_t<T>;
 };
-
-template <typename T>
-struct RemoveRawPointer<T*> {
-  using type = T;
-};
-
 template <typename T, RawPtrTraits Traits>
-struct RemoveRawPointer<raw_ptr<T, Traits>> {
+struct RemovePointer<raw_ptr<T, Traits>> {
   using type = T;
 };
-
 template <typename T>
-using RemoveRawPointerT = typename RemoveRawPointer<T>::type;
+using RemovePointerT = typename RemovePointer<T>::type;
 
 }  // namespace base
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref.h
index b6d0e9a..2e619ba 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref.h
@@ -26,18 +26,10 @@
 template <class T, RawPtrTraits Traits>
 class raw_ref;
 
-namespace internal {
-
 template <class T>
-struct is_raw_ref : std::false_type {};
-
+inline constexpr bool IsRawRef = false;
 template <class T, RawPtrTraits Traits>
-struct is_raw_ref<::base::raw_ref<T, Traits>> : std::true_type {};
-
-template <class T>
-constexpr inline bool is_raw_ref_v = is_raw_ref<T>::value;
-
-}  // namespace internal
+inline constexpr bool IsRawRef<::base::raw_ref<T, Traits>> = true;
 
 // A smart pointer for a pointer which can not be null, and which provides
 // Use-after-Free protection in the same ways as raw_ptr. This class acts like a
@@ -256,25 +248,25 @@
                                    const raw_ref<V, Traits2>& rhs);
 #endif
 
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator==(const raw_ref& lhs,
                                                     const U& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_);  // Catch use-after-move.
     return lhs.inner_ == &rhs;
   }
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator!=(const raw_ref& lhs,
                                                     const U& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_);  // Catch use-after-move.
     return lhs.inner_ != &rhs;
   }
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator==(const U& lhs,
                                                     const raw_ref& rhs) {
     PA_RAW_PTR_CHECK(rhs.inner_);  // Catch use-after-move.
     return &lhs == rhs.inner_;
   }
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator!=(const U& lhs,
                                                     const raw_ref& rhs) {
     PA_RAW_PTR_CHECK(rhs.inner_);  // Catch use-after-move.
@@ -282,62 +274,62 @@
   }
 
 #if PA_HAVE_SPACESHIP_OPERATOR
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr auto operator<=>(const raw_ref& lhs,
                                                      const U& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_);  // Catch use-after-move.
     return lhs.inner_ <=> &rhs;
   }
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr auto operator<=>(const U& lhs,
                                                      const raw_ref& rhs) {
     PA_RAW_PTR_CHECK(rhs.inner_);  // Catch use-after-move.
     return &lhs <=> rhs.inner_;
   }
 #else
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator<(const raw_ref& lhs,
                                                    const U& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_);  // Catch use-after-move.
     return lhs.inner_ < &rhs;
   }
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator>(const raw_ref& lhs,
                                                    const U& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_);  // Catch use-after-move.
     return lhs.inner_ > &rhs;
   }
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator<=(const raw_ref& lhs,
                                                     const U& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_);  // Catch use-after-move.
     return lhs.inner_ <= &rhs;
   }
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator>=(const raw_ref& lhs,
                                                     const U& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_);  // Catch use-after-move.
     return lhs.inner_ >= &rhs;
   }
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator<(const U& lhs,
                                                    const raw_ref& rhs) {
     PA_RAW_PTR_CHECK(rhs.inner_);  // Catch use-after-move.
     return &lhs < rhs.inner_;
   }
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator>(const U& lhs,
                                                    const raw_ref& rhs) {
     PA_RAW_PTR_CHECK(rhs.inner_);  // Catch use-after-move.
     return &lhs > rhs.inner_;
   }
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator<=(const U& lhs,
                                                     const raw_ref& rhs) {
     PA_RAW_PTR_CHECK(rhs.inner_);  // Catch use-after-move.
     return &lhs <= rhs.inner_;
   }
-  template <class U, class = std::enable_if_t<!internal::is_raw_ref_v<U>, void>>
+  template <class U, class = std::enable_if_t<!IsRawRef<U>, void>>
   PA_ALWAYS_INLINE friend constexpr bool operator>=(const U& lhs,
                                                     const raw_ref& rhs) {
     PA_RAW_PTR_CHECK(rhs.inner_);  // Catch use-after-move.
@@ -411,26 +403,15 @@
 template <class T>
 raw_ref(const T&) -> raw_ref<const T>;
 
-// Template helpers for working with raw_ref<T>.
-template <typename T>
-struct IsRawRef : std::false_type {};
-
-template <typename T, RawPtrTraits Traits>
-struct IsRawRef<raw_ref<T, Traits>> : std::true_type {};
-
-template <typename T>
-inline constexpr bool IsRawRefV = IsRawRef<T>::value;
-
+// Converts `raw_ref<T>` => `T`; leaves l/rvalue refs alone.
 template <typename T>
 struct RemoveRawRef {
   using type = T;
 };
-
 template <typename T, RawPtrTraits Traits>
 struct RemoveRawRef<raw_ref<T, Traits>> {
   using type = T;
 };
-
 template <typename T>
 using RemoveRawRefT = typename RemoveRawRef<T>::type;
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h
index a790b31..02d7b0a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h
@@ -162,6 +162,7 @@
 PA_COMPONENT_EXPORT(ALLOCATOR_SHIM)
 void ConfigurePartitions(
     EnableBrp enable_brp,
+    size_t brp_extra_extras_size,
     EnableMemoryTagging enable_memory_tagging,
     partition_alloc::TagViolationReportingMode memory_tagging_reporting_mode,
     BucketDistribution distribution,
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
index 7eec4f9..f3ad2e0 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
@@ -611,6 +611,7 @@
 
 void ConfigurePartitions(
     EnableBrp enable_brp,
+    size_t brp_extra_extras_size,
     EnableMemoryTagging enable_memory_tagging,
     partition_alloc::TagViolationReportingMode memory_tagging_reporting_mode,
     BucketDistribution distribution,
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h
index 129037c0..75e2ad84 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h
@@ -164,6 +164,7 @@
 // this function. They should call ConfigurePartitions() directly.
 PA_ALWAYS_INLINE void ConfigurePartitionsForTesting() {
   auto enable_brp = allocator_shim::EnableBrp(true);
+  size_t brp_extra_extras_size = 0;
 
   // Embedders's tests might benefit from MTE checks. However, this is costly
   // and shouldn't be used in benchmarks.
@@ -184,7 +185,7 @@
   auto use_pool_offset_freelists = UsePoolOffsetFreelists(true);
   auto use_small_single_slot_spans = UseSmallSingleSlotSpans(true);
 
-  ConfigurePartitions(enable_brp, enable_memory_tagging,
+  ConfigurePartitions(enable_brp, brp_extra_extras_size, enable_memory_tagging,
                       memory_tagging_reporting_mode, distribution,
                       scheduler_loop_quarantine,
                       scheduler_loop_quarantine_capacity_in_bytes,
diff --git a/base/check.h b/base/check.h
index b7605cc..a2efe255 100644
--- a/base/check.h
+++ b/base/check.h
@@ -78,56 +78,44 @@
   // Takes ownership of `log_message`.
   explicit CheckError(LogMessage* log_message);
 
-  // All instances that take a base::Location should use
-  // base::Location::CurrentWithoutFunctionName() by default since we
-  // immediately pass file_name() and line_number() to LogMessage's constructor
-  // and discard the function_name() anyways. This saves ~23k on the Android
-  // size bots (as of 2024-12-17) but that's the official build that barely uses
-  // these for CHECKs. The size gains are believed to be significantly larger on
-  // developer builds and official+DCHECK where all CHECK failures generate
-  // logs.
-
   // TODO(pbos): Make all static methods that currently return some version of
   // CheckError return LogMessage*.
-  static CheckError Check(const char* condition,
-                          base::NotFatalUntil fatal_milestone,
-                          const base::Location& location =
-                              base::Location::CurrentWithoutFunctionName());
+  static CheckError Check(
+      const char* condition,
+      base::NotFatalUntil fatal_milestone,
+      const base::Location& location = base::Location::Current());
   // Takes ownership over (free()s after using) `log_message_str`, for use with
   // CHECK_op macros.
-  static LogMessage* CheckOp(char* log_message_str,
-                             base::NotFatalUntil fatal_milestone,
-                             const base::Location& location =
-                                 base::Location::CurrentWithoutFunctionName());
+  static LogMessage* CheckOp(
+      char* log_message_str,
+      base::NotFatalUntil fatal_milestone,
+      const base::Location& location = base::Location::Current());
 
-  static CheckError DCheck(const char* condition,
-                           const base::Location& location =
-                               base::Location::CurrentWithoutFunctionName());
+  static CheckError DCheck(
+      const char* condition,
+      const base::Location& location = base::Location::Current());
   // Takes ownership over (free()s after using) `log_message_str`, for use with
   // DCHECK_op macros.
-  static LogMessage* DCheckOp(char* log_message_str,
-                              const base::Location& location =
-                                  base::Location::CurrentWithoutFunctionName());
+  static LogMessage* DCheckOp(
+      char* log_message_str,
+      const base::Location& location = base::Location::Current());
 
   static CheckError DumpWillBeCheck(
       const char* condition,
-      const base::Location& location =
-          base::Location::CurrentWithoutFunctionName());
+      const base::Location& location = base::Location::Current());
   // Takes ownership over (free()s after using) `log_message_str`, for use with
   // DUMP_WILL_BE_CHECK_op macros.
   static LogMessage* DumpWillBeCheckOp(
       char* log_message_str,
-      const base::Location& location =
-          base::Location::CurrentWithoutFunctionName());
+      const base::Location& location = base::Location::Current());
 
-  static CheckError DPCheck(const char* condition,
-                            const base::Location& location =
-                                base::Location::CurrentWithoutFunctionName());
+  static CheckError DPCheck(
+      const char* condition,
+      const base::Location& location = base::Location::Current());
 
   static CheckError NotImplemented(
       const char* function,
-      const base::Location& location =
-          base::Location::CurrentWithoutFunctionName());
+      const base::Location& location = base::Location::Current());
 
   // Stream for adding optional details to the error message.
   std::ostream& stream();
@@ -156,21 +144,18 @@
 
   static CheckNoreturnError Check(
       const char* condition,
-      const base::Location& location =
-          base::Location::CurrentWithoutFunctionName());
+      const base::Location& location = base::Location::Current());
   // Takes ownership over (free()s after using) `log_message_str`, for use with
   // CHECK_op macros.
-  static LogMessage* CheckOp(char* log_message_str,
-                             const base::Location& location =
-                                 base::Location::CurrentWithoutFunctionName());
+  static LogMessage* CheckOp(
+      char* log_message_str,
+      const base::Location& location = base::Location::Current());
 
   static CheckNoreturnError PCheck(
       const char* condition,
-      const base::Location& location =
-          base::Location::CurrentWithoutFunctionName());
+      const base::Location& location = base::Location::Current());
   static CheckNoreturnError PCheck(
-      const base::Location& location =
-          base::Location::CurrentWithoutFunctionName());
+      const base::Location& location = base::Location::Current());
 };
 
 // Used for NOTREACHED(base::NotFatalUntil) and DUMP_WILL_BE_NOTREACHED().
@@ -178,12 +163,10 @@
  public:
   static NotReachedError NotReached(
       base::NotFatalUntil fatal_milestone,
-      const base::Location& location =
-          base::Location::CurrentWithoutFunctionName());
+      const base::Location& location = base::Location::Current());
 
   static NotReachedError DumpWillBeNotReached(
-      const base::Location& location =
-          base::Location::CurrentWithoutFunctionName());
+      const base::Location& location = base::Location::Current());
 
   NOMERGE NOINLINE NOT_TAIL_CALLED ~NotReachedError();
 
@@ -195,8 +178,7 @@
 class BASE_EXPORT NotReachedNoreturnError : public CheckError {
  public:
   explicit NotReachedNoreturnError(
-      const base::Location& location =
-          base::Location::CurrentWithoutFunctionName());
+      const base::Location& location = base::Location::Current());
 
   [[noreturn]] NOMERGE NOINLINE NOT_TAIL_CALLED ~NotReachedNoreturnError();
 };
@@ -215,6 +197,9 @@
 // The weird ternary is to still generate an "is not contextually convertible to
 // 'bool' when provided weird parameters (regardless of ANALYZER_ASSUME_TRUE's
 // implementation). See base/check_nocompile.nc.
+//
+// The lambda is here to here permit the compiler to out-of-line much of the
+// CHECK-failure path and optimize better for the fast path.
 #define LOGGING_CHECK_FUNCTION_IMPL(check_stream, condition) \
   switch (0)                                                 \
   case 0:                                                    \
@@ -222,7 +207,7 @@
     if (ANALYZER_ASSUME_TRUE((condition) ? true : false))    \
       [[likely]];                                            \
     else                                                     \
-      (check_stream)
+      [&]() { return (check_stream); }()
 
 // A helper macro like LOGGING_CHECK_FUNCTION_IMPL above but discarding any
 // log-stream parameters rather than evaluate them on failure.
diff --git a/base/check_deref.h b/base/check_deref.h
index a545ce8c..fe881b29 100644
--- a/base/check_deref.h
+++ b/base/check_deref.h
@@ -28,23 +28,22 @@
 //
 //   MyType& type_ref = CHECK_DEREF(your_wrapped_pointer.get());
 //
-#define CHECK_DEREF(ptr) \
-  ::logging::CheckDeref(ptr, #ptr " != nullptr", __FILE__, __LINE__)
+#define CHECK_DEREF(ptr) ::logging::CheckDeref(ptr, #ptr " != nullptr")
 
 template <typename T>
-[[nodiscard]] T& CheckDeref(T* ptr,
-                            const char* message,
-                            const char* file,
-                            int line) {
+[[nodiscard]] T& CheckDeref(
+    T* ptr,
+    const char* message,
+    const base::Location& location = base::Location::Current()) {
   // Note: we can't just call `CHECK_NE(ptr, nullptr)` here, as that would
   // cause the error to be reported from this header, and we want the error
   // to be reported at the file and line of the caller.
   if (ptr == nullptr) [[unlikely]] {
-#if !CHECK_WILL_STREAM()
-    CheckFailure();
+#if CHECK_WILL_STREAM()
+    // `CheckNoreturnError` will die with a fatal error in its destructor.
+    CheckNoreturnError::Check(message, location);
 #else
-    // `LogMessage` will die with a fatal error in its destructor.
-    LogMessage(file, line, message);
+    CheckFailure();
 #endif  // !CHECK_WILL_STREAM()
   }
   return *ptr;
diff --git a/base/functional/bind_internal.h b/base/functional/bind_internal.h
index 9625df06..725744e 100644
--- a/base/functional/bind_internal.h
+++ b/base/functional/bind_internal.h
@@ -21,7 +21,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/raw_ptr_asan_bound_arg_tracker.h"
 #include "base/memory/raw_ref.h"
-#include "base/memory/raw_scoped_refptr_mismatch_checker.h"
 #include "base/memory/weak_ptr.h"
 #include "base/notreached.h"
 #include "base/types/always_false.h"
@@ -331,7 +330,7 @@
 template <typename T>
 struct MethodReceiverStorage {
   using Type = std::
-      conditional_t<IsRawPointer<T>, scoped_refptr<RemoveRawPointerT<T>>, T>;
+      conditional_t<IsPointerOrRawPtr<T>, scoped_refptr<RemovePointerT<T>>, T>;
 };
 
 template <typename T, typename UnretainedTrait, RawPtrTraits PtrTraits>
@@ -597,12 +596,6 @@
   requires !IsObjCArcBlockPointer<std::decay_t<Functor>>;
 };
 
-// `HasRefCountedTypeAsRawPtr` is true when any of the `Args` is a raw pointer
-// to a `RefCounted` type.
-template <typename... Ts>
-concept HasRefCountedTypeAsRawPtr =
-    std::disjunction_v<NeedsScopedRefptrButGetsRawPtr<Ts>...>;
-
 // `ForceVoidReturn<>` converts a signature to have a `void` return type.
 template <typename Sig>
 struct ForceVoidReturn;
@@ -1079,8 +1072,8 @@
 template <typename Receiver, typename... Unused>
 void VerifyMethodReceiver(Receiver&& receiver, Unused&&...) {
   // Asserts that a callback is not the first owner of a ref-counted receiver.
-  if constexpr (IsRawPointer<std::decay_t<Receiver>> &&
-                IsRefCountedType<RemoveRawPointerT<std::decay_t<Receiver>>>) {
+  if constexpr (IsPointerOrRawPtr<std::decay_t<Receiver>> &&
+                IsRefCountedType<RemovePointerT<std::decay_t<Receiver>>>) {
     DCHECK(receiver);
 
     // It's error prone to make the implicit first reference to ref-counted
@@ -1214,6 +1207,31 @@
   }
 };
 
+template <typename... BoundArgs>
+struct ValidateBindStateTypeCommonChecks {
+ private:
+  // Refcounted parameters must be passed as `scoped_refptr` instead of raw
+  // pointers, to ensure they are not deleted before use.
+  // TODO(danakj): Ban native references and `std::reference_wrapper` too.
+  template <typename T,
+            bool v =
+                (IsRawRef<T> && IsRefCountedType<base::RemoveRawRefT<T>>) ||
+                (IsPointerOrRawPtr<T> &&
+                 IsRefCountedType<base::RemovePointerT<T>>)>
+  struct RefCountedTypeNotPassedByRawPointer {
+    static constexpr bool value = [] {
+      static_assert(
+          !v, "A parameter is a refcounted type and needs scoped_refptr.");
+      return !v;
+    }();
+  };
+
+ public:
+  using CommonCheckResult = std::conjunction<
+      RefCountedTypeNotPassedByRawPointer<std::decay_t<BoundArgs>>...,
+      ValidateStorageTraits<BoundArgs>...>;
+};
+
 // Used to determine and validate the appropriate `BindState`. The
 // specializations below cover all cases. The members are similar in intent to
 // those in `StorageTraits`; see comments there.
@@ -1233,25 +1251,13 @@
                              is_callback,
                              Functor,
                              BoundArgs...> {
- private:
-  template <bool v = !HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>>
-  struct NoRawPtrsToRefCountedTypes {
-    static constexpr bool value = [] {
-      static_assert(
-          v, "A parameter is a refcounted type and needs scoped_refptr.");
-      return v;
-    }();
-  };
-
- public:
   using Type = BindState<false,
                          is_nullable,
                          is_callback,
                          std::decay_t<Functor>,
                          typename ValidateStorageTraits<BoundArgs>::Type...>;
   static constexpr bool value =
-      std::conjunction_v<NoRawPtrsToRefCountedTypes<>,
-                         ValidateStorageTraits<BoundArgs>...>;
+      ValidateBindStateTypeCommonChecks<BoundArgs...>::CommonCheckResult::value;
 };
 
 template <bool is_nullable, bool is_callback, typename Functor>
@@ -1284,7 +1290,7 @@
     }();
   };
 
-  template <bool v = !IsRawRefV<DecayedReceiver>>
+  template <bool v = !IsRawRef<DecayedReceiver>>
   struct ReceiverIsNotRawRef {
     static constexpr bool value = [] {
       static_assert(v, "Receivers may not be raw_ref<T>. If using a raw_ref<T> "
@@ -1294,8 +1300,8 @@
     }();
   };
 
-  template <bool v = !IsRawPointer<DecayedReceiver> ||
-                     IsRefCountedType<RemoveRawPointerT<DecayedReceiver>>>
+  template <bool v = !IsPointerOrRawPtr<DecayedReceiver> ||
+                     IsRefCountedType<RemovePointerT<DecayedReceiver>>>
   struct ReceiverIsNotRawPtr {
     static constexpr bool value = [] {
       static_assert(v,
@@ -1306,15 +1312,6 @@
     }();
   };
 
-  template <bool v = !HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>>
-  struct NoRawPtrsToRefCountedTypes {
-    static constexpr bool value = [] {
-      static_assert(
-          v, "A parameter is a refcounted type and needs scoped_refptr.");
-      return v;
-    }();
-  };
-
  public:
   using Type = BindState<true,
                          is_nullable,
@@ -1326,8 +1323,8 @@
       std::conjunction_v<FirstBoundArgIsNotArray<>,
                          ReceiverIsNotRawRef<>,
                          ReceiverIsNotRawPtr<>,
-                         NoRawPtrsToRefCountedTypes<>,
-                         ValidateStorageTraits<BoundArgs>...>;
+                         typename ValidateBindStateTypeCommonChecks<
+                             BoundArgs...>::CommonCheckResult>;
 };
 
 // Transforms `T` into an unwrapped type, which is passed to the target
@@ -1441,9 +1438,9 @@
   struct ForwardedAs {
     template <typename FunctorParamType>
     struct ToParamWithType {
-      static constexpr bool kRawPtr = IsRawPtrV<FunctorParamType>;
+      static constexpr bool kRawPtr = IsRawPtr<FunctorParamType>;
       static constexpr bool kRawPtrMayBeDangling =
-          IsRawPtrMayDangleV<FunctorParamType>;
+          IsRawPtrMayDangle<FunctorParamType>;
       static constexpr bool kCanBeForwardedToBoundFunctor =
           std::is_convertible_v<ForwardingType, FunctorParamType>;
 
diff --git a/base/i18n/string_search.cc b/base/i18n/string_search.cc
index 0436168c..63e54a6 100644
--- a/base/i18n/string_search.cc
+++ b/base/i18n/string_search.cc
@@ -2,11 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/i18n/string_search.h"
-
 #include <stdint.h>
 
-#include <string_view>
+#include "base/i18n/string_search.h"
 
 #include "base/check.h"
 #include "base/check_op.h"
@@ -16,17 +14,18 @@
 namespace i18n {
 
 FixedPatternStringSearch::FixedPatternStringSearch(
-    std::u16string_view find_this,
+    const std::u16string& find_this,
     bool case_sensitive)
     : find_this_(find_this) {
+  // usearch_open requires a valid string argument to be searched, even if we
+  // want to set it by usearch_setText afterwards. So, supplying a dummy text.
+  const std::u16string& dummy = find_this_;
+
   UErrorCode status = U_ZERO_ERROR;
-  search_ =
-      usearch_open(find_this_.data(), find_this_.size(),
-                   // `usearch_open()` requires a valid string argument to be
-                   // searched, even if we want to set it by `usearch_setText()`
-                   // afterwards. So just provide `find_this_` again.
-                   find_this_.data(), find_this_.size(), uloc_getDefault(),
-                   /*breakiter=*/nullptr, &status);
+  search_ = usearch_open(find_this_.data(), find_this_.size(), dummy.data(),
+                         dummy.size(), uloc_getDefault(),
+                         nullptr,  // breakiter
+                         &status);
   if (U_SUCCESS(status)) {
     // http://icu-project.org/apiref/icu4c40/ucol_8h.html#6a967f36248b0a1bc7654f538ee8ba96
     // Set comparison level to UCOL_PRIMARY to ignore secondary and tertiary
@@ -47,7 +46,7 @@
     usearch_close(search_.ExtractAsDangling());
 }
 
-bool FixedPatternStringSearch::Search(std::u16string_view in_this,
+bool FixedPatternStringSearch::Search(const std::u16string& in_this,
                                       size_t* match_index,
                                       size_t* match_length,
                                       bool forward_search) {
@@ -82,27 +81,27 @@
 
 FixedPatternStringSearchIgnoringCaseAndAccents::
     FixedPatternStringSearchIgnoringCaseAndAccents(
-        std::u16string_view find_this)
+        const std::u16string& find_this)
     : base_search_(find_this, /*case_sensitive=*/false) {}
 
 bool FixedPatternStringSearchIgnoringCaseAndAccents::Search(
-    std::u16string_view in_this,
+    const std::u16string& in_this,
     size_t* match_index,
     size_t* match_length) {
   return base_search_.Search(in_this, match_index, match_length,
                              /*forward_search=*/true);
 }
 
-bool StringSearchIgnoringCaseAndAccents(std::u16string_view find_this,
-                                        std::u16string_view in_this,
+bool StringSearchIgnoringCaseAndAccents(const std::u16string& find_this,
+                                        const std::u16string& in_this,
                                         size_t* match_index,
                                         size_t* match_length) {
   return FixedPatternStringSearchIgnoringCaseAndAccents(find_this).Search(
       in_this, match_index, match_length);
 }
 
-bool StringSearch(std::u16string_view find_this,
-                  std::u16string_view in_this,
+bool StringSearch(const std::u16string& find_this,
+                  const std::u16string& in_this,
                   size_t* match_index,
                   size_t* match_length,
                   bool case_sensitive,
@@ -111,8 +110,8 @@
       .Search(in_this, match_index, match_length, forward_search);
 }
 
-RepeatingStringSearch::RepeatingStringSearch(std::u16string_view find_this,
-                                             std::u16string_view in_this,
+RepeatingStringSearch::RepeatingStringSearch(const std::u16string& find_this,
+                                             const std::u16string& in_this,
                                              bool case_sensitive)
     : find_this_(find_this), in_this_(in_this) {
   std::string locale = uloc_getDefault();
diff --git a/base/i18n/string_search.h b/base/i18n/string_search.h
index 0cb3e913..c50ae33 100644
--- a/base/i18n/string_search.h
+++ b/base/i18n/string_search.h
@@ -7,9 +7,8 @@
 
 #include <stddef.h>
 
-#include <string_view>
+#include <string>
 
-#include "base/compiler_specific.h"
 #include "base/i18n/base_i18n_export.h"
 #include "base/memory/raw_ptr.h"
 
@@ -26,8 +25,8 @@
 // accent differences are ignored. Please refer to 'primary level' in
 // http://userguide.icu-project.org/collation/concepts for additional details.
 BASE_I18N_EXPORT
-bool StringSearchIgnoringCaseAndAccents(std::u16string_view find_this,
-                                        std::u16string_view in_this,
+bool StringSearchIgnoringCaseAndAccents(const std::u16string& find_this,
+                                        const std::u16string& in_this,
                                         size_t* match_index,
                                         size_t* match_length);
 
@@ -42,8 +41,8 @@
 // When |forward_search| is true, finds the first instance of |find_this|,
 // otherwise finds the last instance
 BASE_I18N_EXPORT
-bool StringSearch(std::u16string_view find_this,
-                  std::u16string_view in_this,
+bool StringSearch(const std::u16string& find_this,
+                  const std::u16string& in_this,
                   size_t* match_index,
                   size_t* match_length,
                   bool case_sensitive,
@@ -52,38 +51,37 @@
 // This class is for speeding up multiple StringSearch()
 // with the same |find_this| argument. |find_this| is passed as the constructor
 // argument, and precomputation for searching is done only at that time.
-class BASE_I18N_EXPORT GSL_POINTER FixedPatternStringSearch {
+class BASE_I18N_EXPORT FixedPatternStringSearch {
  public:
-  explicit FixedPatternStringSearch(std::u16string_view find_this,
+  explicit FixedPatternStringSearch(const std::u16string& find_this,
                                     bool case_sensitive);
   ~FixedPatternStringSearch();
 
   // Returns true if |in_this| contains |find_this|. If |match_index| or
   // |match_length| are non-NULL, they are assigned the start position and total
   // length of the match.
-  bool Search(std::u16string_view in_this,
+  bool Search(const std::u16string& in_this,
               size_t* match_index,
               size_t* match_length,
               bool forward_search);
 
  private:
-  std::u16string_view find_this_;
+  std::u16string find_this_;
   raw_ptr<UStringSearch> search_;
 };
 
 // This class is for speeding up multiple StringSearchIgnoringCaseAndAccents()
 // with the same |find_this| argument. |find_this| is passed as the constructor
 // argument, and precomputation for searching is done only at that time.
-class BASE_I18N_EXPORT GSL_POINTER
-    FixedPatternStringSearchIgnoringCaseAndAccents {
+class BASE_I18N_EXPORT FixedPatternStringSearchIgnoringCaseAndAccents {
  public:
   explicit FixedPatternStringSearchIgnoringCaseAndAccents(
-      std::u16string_view find_this);
+      const std::u16string& find_this);
 
   // Returns true if |in_this| contains |find_this|. If |match_index| or
   // |match_length| are non-NULL, they are assigned the start position and total
   // length of the match.
-  bool Search(std::u16string_view in_this,
+  bool Search(const std::u16string& in_this,
               size_t* match_index,
               size_t* match_length);
 
@@ -93,10 +91,10 @@
 
 // This class is for performing all matches of `find_this` in `in_this`.
 // `find_this` and `in_this` are passed as arguments in constructor.
-class BASE_I18N_EXPORT GSL_POINTER RepeatingStringSearch {
+class BASE_I18N_EXPORT RepeatingStringSearch {
  public:
-  RepeatingStringSearch(std::u16string_view find_this,
-                        std::u16string_view in_this,
+  RepeatingStringSearch(const std::u16string& find_this,
+                        const std::u16string& in_this,
                         bool case_sensitive);
   ~RepeatingStringSearch();
 
@@ -105,8 +103,8 @@
   bool NextMatchResult(int& match_index, int& match_length);
 
  private:
-  std::u16string_view find_this_;
-  std::u16string_view in_this_;
+  std::u16string find_this_;
+  std::u16string in_this_;
   raw_ptr<UStringSearch> search_;
 };
 
diff --git a/base/location.cc b/base/location.cc
index da4356f..917460f 100644
--- a/base/location.cc
+++ b/base/location.cc
@@ -137,13 +137,6 @@
                   RETURN_ADDRESS());
 }
 
-// static
-NOINLINE Location Location::CurrentWithoutFunctionName(const char* file_name,
-                                                       int line_number) {
-  return Location(nullptr, file_name + kStrippedPrefixLength, line_number,
-                  RETURN_ADDRESS());
-}
-
 //------------------------------------------------------------------------------
 NOINLINE const void* GetProgramCounter() {
   return RETURN_ADDRESS();
diff --git a/base/location.h b/base/location.h
index f324c40..e9bc21a 100644
--- a/base/location.h
+++ b/base/location.h
@@ -79,10 +79,6 @@
                           const char* file_name = __builtin_FILE(),
                           int line_number = __builtin_LINE());
 
-  static Location CurrentWithoutFunctionName(
-      const char* file_name = __builtin_FILE(),
-      int line_number = __builtin_LINE());
-
  private:
   // Only initializes the file name and program counter, the source information
   // will be null for the strings, and -1 for the line number.
diff --git a/base/logging.cc b/base/logging.cc
index 59826a9..c9c4b2e7 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -703,12 +703,6 @@
   Init(file, line);
 }
 
-LogMessage::LogMessage(const char* file, int line, const char* condition)
-    : severity_(LOGGING_FATAL), file_(file), line_(line) {
-  Init(file, line);
-  stream_ << "Check failed: " << condition << ". ";
-}
-
 LogMessage::~LogMessage() {
   Flush();
 }
diff --git a/base/logging.h b/base/logging.h
index 5b6d265..0be64c7 100644
--- a/base/logging.h
+++ b/base/logging.h
@@ -586,11 +586,8 @@
 // above.
 class BASE_EXPORT LogMessage {
  public:
-  // Used for LOG(severity).
   LogMessage(const char* file, int line, LogSeverity severity);
 
-  // Used for CHECK().  Implied severity = LOGGING_FATAL.
-  LogMessage(const char* file, int line, const char* condition);
   LogMessage(const LogMessage&) = delete;
   LogMessage& operator=(const LogMessage&) = delete;
   virtual ~LogMessage();
diff --git a/base/memory/raw_ptr_asan_bound_arg_tracker.h b/base/memory/raw_ptr_asan_bound_arg_tracker.h
index e698398..0a56733 100644
--- a/base/memory/raw_ptr_asan_bound_arg_tracker.h
+++ b/base/memory/raw_ptr_asan_bound_arg_tracker.h
@@ -79,7 +79,7 @@
       auto inner = arg.get();
       // The argument may unwrap into a raw_ptr or a T* depending if it is
       // allowed to dangle.
-      if constexpr (IsRawPtrV<decltype(inner)>) {
+      if constexpr (IsRawPtr<decltype(inner)>) {
         Add(reinterpret_cast<uintptr_t>(inner.get()));
       } else {
         Add(reinterpret_cast<uintptr_t>(inner));
diff --git a/base/memory/raw_scoped_refptr_mismatch_checker.h b/base/memory/raw_scoped_refptr_mismatch_checker.h
deleted file mode 100644
index c06bb77..0000000
--- a/base/memory/raw_scoped_refptr_mismatch_checker.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2011 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_MEMORY_RAW_SCOPED_REFPTR_MISMATCH_CHECKER_H_
-#define BASE_MEMORY_RAW_SCOPED_REFPTR_MISMATCH_CHECKER_H_
-
-#include <type_traits>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/raw_ref.h"
-
-// It is dangerous to post a task with a T* argument where T is a subtype of
-// RefCounted(Base|ThreadSafeBase), since by the time the parameter is used, the
-// object may already have been deleted since it was not held with a
-// scoped_refptr. Example: http://crbug.com/27191
-// The following set of traits are designed to generate a compile error
-// whenever this antipattern is attempted.
-
-namespace base::internal {
-
-template <typename T>
-concept IsRefCountedType = requires(T& x) {
-  // There are no additional constraints on `AddRef()` and `Release()` since
-  // `scoped_refptr`, for better or worse`, seamlessly interoperates with other
-  // non-base types that happen to implement the same signatures (e.g. COM's
-  // IUnknown).
-  x.AddRef();
-  x.Release();
-};
-
-// Human readable translation: you needed to be a scoped_refptr if you are a raw
-// pointer type and are convertible to a RefCounted(Base|ThreadSafeBase) type.
-template <typename T>
-struct NeedsScopedRefptrButGetsRawPtr {
-  static_assert(!std::is_reference_v<T>,
-                "NeedsScopedRefptrButGetsRawPtr requires non-reference type.");
-
-  // TODO(danakj): Should ban native references and
-  // std::reference_wrapper here too.
-  static constexpr bool value =
-      (base::IsRawRef<T>::value && IsRefCountedType<base::RemoveRawRefT<T>>) ||
-      (base::IsRawPointer<T> && IsRefCountedType<base::RemoveRawPointerT<T>>);
-};
-
-}  // namespace base::internal
-
-#endif  // BASE_MEMORY_RAW_SCOPED_REFPTR_MISMATCH_CHECKER_H_
diff --git a/base/memory/ref_counted.h b/base/memory/ref_counted.h
index 45bdab4..4cbb2cef 100644
--- a/base/memory/ref_counted.h
+++ b/base/memory/ref_counted.h
@@ -250,6 +250,16 @@
 
 }  // namespace subtle
 
+template <typename T>
+concept IsRefCountedType = requires(T& x) {
+  // There are no additional constraints on `AddRef()` and `Release()` since
+  // `scoped_refptr`, for better or worse, seamlessly interoperates with other
+  // non-base types that happen to implement the same signatures (e.g. COM's
+  // `IUnknown`).
+  x.AddRef();
+  x.Release();
+};
+
 // ScopedAllowCrossThreadRefCountAccess disables the check documented on
 // RefCounted below for rare pre-existing use cases where thread-safety was
 // guaranteed through other means (e.g. explicit sequencing of calls across
@@ -440,9 +450,9 @@
 // A thread-safe wrapper for some piece of data so we can place other
 // things in scoped_refptrs<>.
 //
-template<typename T>
+template <typename T>
 class RefCountedData
-    : public base::RefCountedThreadSafe< base::RefCountedData<T> > {
+    : public base::RefCountedThreadSafe<base::RefCountedData<T>> {
  public:
   RefCountedData() : data() {}
   RefCountedData(const T& in_value) : data(in_value) {}
diff --git a/base/notimplemented.h b/base/notimplemented.h
index e92fe2c1..f35ad0db 100644
--- a/base/notimplemented.h
+++ b/base/notimplemented.h
@@ -16,15 +16,24 @@
   ::logging::CheckError::NotImplemented(__PRETTY_FUNCTION__)
 
 // The lambda returns false the first time it is run, and true every other time.
-#define NOTIMPLEMENTED_LOG_ONCE()                                \
-  LOGGING_CHECK_FUNCTION_IMPL(NOTIMPLEMENTED(), [] {             \
-    bool old_value = true;                                       \
-    [[maybe_unused]] static const bool call_once = [](bool* b) { \
-      *b = false;                                                \
-      return true;                                               \
-    }(&old_value);                                               \
-    return old_value;                                            \
-  }())
+// Note that the `static const bool call_once` trickery is used for thread
+// safety (C++11 guarantees that `call_once` is only initialized once, no UB
+// even if two threads enter concurrently).
+#define NOTIMPLEMENTED_LOG_ONCE()                                      \
+  switch (0)                                                           \
+  case 0:                                                              \
+  default:                                                             \
+    if ([] {                                                           \
+          bool old_value = true;                                       \
+          [[maybe_unused]] static const bool call_once = [](bool* b) { \
+            *b = false;                                                \
+            return true;                                               \
+          }(&old_value);                                               \
+          return old_value;                                            \
+        }())                                                           \
+      ;                                                                \
+    else                                                               \
+      NOTIMPLEMENTED()
 
 #else
 #define NOTIMPLEMENTED() EAT_CHECK_STREAM_PARAMS()
diff --git a/base/test/scoped_run_loop_timeout.cc b/base/test/scoped_run_loop_timeout.cc
index 6fac888..fb83153 100644
--- a/base/test/scoped_run_loop_timeout.cc
+++ b/base/test/scoped_run_loop_timeout.cc
@@ -35,10 +35,9 @@
 void StandardTimeoutCallback(const Location& timeout_enabled_from_here,
                              RepeatingCallback<std::string()> on_timeout_log,
                              const Location& run_from_here) {
-  const std::string message =
-      TimeoutMessage(on_timeout_log, timeout_enabled_from_here);
-  logging::LogMessage(run_from_here.file_name(), run_from_here.line_number(),
-                      message.data());
+  logging::CheckNoreturnError::Check(
+      TimeoutMessage(on_timeout_log, timeout_enabled_from_here).data(),
+      run_from_here);
 }
 
 void TimeoutCallbackWithGtestFailure(
diff --git a/base/trace_event/memory_usage_estimator.h b/base/trace_event/memory_usage_estimator.h
index 11a8d953..8a3c9c04 100644
--- a/base/trace_event/memory_usage_estimator.h
+++ b/base/trace_event/memory_usage_estimator.h
@@ -249,7 +249,7 @@
 
 template <typename T>
 concept IsKnownNonAllocatingType =
-    std::is_trivially_destructible_v<T> || base::IsRawPtrV<T> ||
+    std::is_trivially_destructible_v<T> || base::IsRawPtr<T> ||
     IsIteratorOfStandardContainer<T>;
 
 }  // namespace internal
diff --git a/buildtools/clang_format/README.chromium b/buildtools/clang_format/README.chromium
index 9c10acc..b7c53c25 100644
--- a/buildtools/clang_format/README.chromium
+++ b/buildtools/clang_format/README.chromium
@@ -3,7 +3,7 @@
 URL: https://github.com/llvm/llvm-project/tree/main/clang/tools/clang-format
 Version: llvmorg-17-init-4759-g547e3456
 Date: 2023-03-21
-Revision: llvmorg-17-init-4759-g547e3456
+Revision: 547e3456
 License: Apache 2.0 / University of Illinois/NCSA Open Source License
 Security Critical: No
 Shipped: no
diff --git a/chrome/VERSION b/chrome/VERSION
index 6ceb105..f2a2336 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=133
 MINOR=0
-BUILD=6903
+BUILD=6904
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 71df923..48edc13 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -116,7 +116,6 @@
 import org.chromium.chrome.browser.flags.ActivityType;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
-import org.chromium.chrome.browser.fonts.FontPreloader;
 import org.chromium.chrome.browser.gesturenav.NavigationSheet;
 import org.chromium.chrome.browser.history.HistoryManager;
 import org.chromium.chrome.browser.history.HistoryManagerUtils;
@@ -2254,8 +2253,6 @@
 
         if (isFinishing()) return;
 
-        FontPreloader.getInstance().onPostInflationStartupTabbedActivity();
-
         TabModelSelector tabModelSelector = getTabModelSelector();
         IncognitoProfileDestroyer.observeTabModelSelector(tabModelSelector);
         IncognitoNotificationPresenceController.observeTabModelSelector(tabModelSelector);
@@ -2269,12 +2266,6 @@
         mContentContainer = findViewById(android.R.id.content);
         mControlContainer = findViewById(R.id.control_container);
 
-        // Instead of overriding AsyncInitializationActivity#onFirstDrawComplete like the other
-        // activities, we're adding our own draw detector here because this activity's draw can be
-        // blocked by AppLaunchDrawBlocker, and #onFirstDrawComplete doesn't account for that.
-        FirstDrawDetector.waitForFirstDrawStrict(
-                mContentContainer, () -> FontPreloader.getInstance().onFirstDrawTabbedActivity());
-
         Supplier<Boolean> dialogVisibilitySupplier =
                 () -> {
                     // Return true if dialog from either tab switcher or tab strip is visible.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
index 6197d83..a9a66aa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -46,7 +46,6 @@
 import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabHistoryIphController;
 import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
-import org.chromium.chrome.browser.fonts.FontPreloader;
 import org.chromium.chrome.browser.history.HistoryManager;
 import org.chromium.chrome.browser.history.HistoryManagerUtils;
 import org.chromium.chrome.browser.history.HistoryTabHelper;
@@ -163,8 +162,6 @@
     public void performPostInflationStartup() {
         super.performPostInflationStartup();
 
-        FontPreloader.getInstance().onPostInflationStartupCustomTabActivity();
-
         mRootUiCoordinator.getStatusBarColorController().updateStatusBarColor();
 
         // Properly attach tab's InfoBarContainer to the view hierarchy if the tab is already
@@ -197,13 +194,6 @@
     }
 
     @Override
-    protected void onFirstDrawComplete() {
-        super.onFirstDrawComplete();
-
-        FontPreloader.getInstance().onFirstDrawCustomTabActivity();
-    }
-
-    @Override
     public void finishNativeInitialization() {
         if (!getIntentDataProvider().isInfoPage()) {
             FirstRunSignInProcessor.openSyncSettingsIfScheduled(this);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
index 32041998..8f60f1c7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
@@ -29,7 +29,6 @@
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
-import org.chromium.chrome.browser.fonts.FontPreloader;
 import org.chromium.chrome.browser.metrics.UmaUtils;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
@@ -394,20 +393,6 @@
     }
 
     @Override
-    protected void performPostInflationStartup() {
-        super.performPostInflationStartup();
-
-        FontPreloader.getInstance().onPostInflationStartupFre();
-    }
-
-    @Override
-    protected void onFirstDrawComplete() {
-        super.onFirstDrawComplete();
-
-        FontPreloader.getInstance().onFirstDrawFre();
-    }
-
-    @Override
     public void finishNativeInitialization() {
         super.finishNativeInitialization();
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fonts/FontPreloader.java b/chrome/android/java/src/org/chromium/chrome/browser/fonts/FontPreloader.java
index 1fe14a4..b2f80063 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/fonts/FontPreloader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/fonts/FontPreloader.java
@@ -6,21 +6,17 @@
 
 import android.content.Context;
 import android.graphics.Typeface;
-import android.os.SystemClock;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 import androidx.core.content.res.ResourcesCompat;
 
 import org.chromium.base.ThreadUtils.ThreadChecker;
-import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.R;
 
 /**
- * Class to load downloadable fonts async and emit histograms related to the availability of these
- * fonts. It should be used by calling {@link FontPreloader#load) early in the app start-up, e.g.
- * {@link Application#onCreate}. The {@link Activity}s should also call the #on* methods to notify
- * this class of the events as they are used to record metrics.
+ * Class to load downloadable fonts async. It should be used by calling {@link FontPreloader#load)
+ * early in the app start-up, e.g. {@link Application#onCreate}.
  */
 public class FontPreloader {
     private static FontPreloader sInstance;
@@ -33,35 +29,10 @@
         R.font.chrome_google_sans_text_medium
     };
 
-    private static final String UMA_PREFIX = "Android.Fonts";
-
-    private static final String UMA_FONTS_RETRIEVED_BEFORE_INFLATION =
-            "TimeDownloadableFontsRetrievedBeforePostInflationStartup";
-    private static final String UMA_FONTS_RETRIEVED_AFTER_ON_CREATE =
-            "TimeToRetrieveDownloadableFontsAfterOnCreate";
-    private static final String UMA_FONTS_RETRIEVED_AFTER_INFLATION =
-            "TimeDownloadableFontsRetrievedAfterPostInflationStartup";
-
-    private static final String UMA_FONTS_RETRIEVED_BEFORE_FIRST_DRAW =
-            "TimeDownloadableFontsRetrievedBeforeFirstDraw";
-    private static final String UMA_FONTS_RETRIEVED_AFTER_FIRST_DRAW =
-            "TimeDownloadableFontsRetrievedAfterFirstDraw";
-
-    private static final String UMA_FRE = "FirstRunActivity";
-    private static final String UMA_TABBED_ACTIVITY = "ChromeTabbedActivity";
-    private static final String UMA_CUSTOM_TAB_ACTIVITY = "CustomTabActivity";
-
     private final ThreadChecker mThreadChecker = new ThreadChecker();
 
     private final Integer[] mFonts;
     private boolean mInitialized;
-    // Time of first event between |#onAllFontsRetrieved()| and |#onPostInflationStartup*()|.
-    private Long mTimeOfFirstEventForPostInflation;
-    private long mTimeOfLoadCall;
-    private String mActivityNameForPostInflation;
-    // Time of first event between |#onAllFontsRetrieved()| and |#onFirstDraw*()|.
-    private Long mTimeOfFirstEventForFirstDraw;
-    private String mActivityNameForFirstDraw;
 
     @VisibleForTesting
     FontPreloader(Integer[] fonts) {
@@ -92,145 +63,18 @@
         if (!mInitialized) {
             mInitialized = true;
             context = context.getApplicationContext();
-            OnFontCallback callback = new OnFontCallback();
+            // Create an empty callback so we can call the async version of #getFont.
+            var callback =
+                    new ResourcesCompat.FontCallback() {
+                        @Override
+                        public void onFontRetrieved(@NonNull Typeface typeface) {}
+
+                        @Override
+                        public void onFontRetrievalFailed(int i) {}
+                    };
             for (int font : mFonts) {
                 ResourcesCompat.getFont(context, font, callback, null);
             }
-            mTimeOfLoadCall = SystemClock.elapsedRealtime();
         }
     }
-
-    /** Should be called from FirstRunActivity to notify this class of post-inflation startup. */
-    public void onPostInflationStartupFre() {
-        mThreadChecker.assertOnValidThread();
-        onPostInflationStartup(UMA_FRE);
-    }
-
-    /** Should be called from FirstRunActivity to notify this class of the first draw. */
-    public void onFirstDrawFre() {
-        mThreadChecker.assertOnValidThread();
-        onFirstDraw(UMA_FRE);
-    }
-
-    /**
-     * Should be called from ChromeTabbedActivity to notify this class of post-inflation startup.
-     */
-    public void onPostInflationStartupTabbedActivity() {
-        mThreadChecker.assertOnValidThread();
-        onPostInflationStartup(UMA_TABBED_ACTIVITY);
-    }
-
-    /**
-     * Should be called from ChromeTabbedActivity to notify this class of the first draw. The first
-     * draw of ChromeTabbedActivity may be blocked by AppLaunchDrawBlocker, so the caller should
-     * account for that.
-     */
-    public void onFirstDrawTabbedActivity() {
-        mThreadChecker.assertOnValidThread();
-        onFirstDraw(UMA_TABBED_ACTIVITY);
-    }
-
-    /** Should be called from CustomTabActivity to notify this class of post-inflation startup. */
-    public void onPostInflationStartupCustomTabActivity() {
-        mThreadChecker.assertOnValidThread();
-        onPostInflationStartup(UMA_CUSTOM_TAB_ACTIVITY);
-    }
-
-    /** Should be called from CustomTabActivity to notify this class of the first draw. */
-    public void onFirstDrawCustomTabActivity() {
-        mThreadChecker.assertOnValidThread();
-        onFirstDraw(UMA_CUSTOM_TAB_ACTIVITY);
-    }
-
-    private void onPostInflationStartup(String activityName) {
-        // Multiple activities will notify us when they are post inflation, but only the first one
-        // matters. It is the one we're racing against to load fonts before they're needed.
-        if (mActivityNameForPostInflation != null) return;
-        mActivityNameForPostInflation = activityName;
-
-        final long time = SystemClock.elapsedRealtime();
-        if (mTimeOfFirstEventForPostInflation == null) {
-            mTimeOfFirstEventForPostInflation = time;
-        } else {
-            RecordHistogram.recordTimesHistogram(
-                    String.format(
-                            "%s.%s.%s",
-                            UMA_PREFIX, UMA_FONTS_RETRIEVED_BEFORE_INFLATION, activityName),
-                    time - mTimeOfFirstEventForPostInflation);
-        }
-    }
-
-    private void onFirstDraw(String activityName) {
-        // Multiple activities will notify us when they do their first draw, but only the first one
-        // matters.
-        if (mActivityNameForFirstDraw != null) return;
-        mActivityNameForFirstDraw = activityName;
-
-        long time = SystemClock.elapsedRealtime();
-        if (mTimeOfFirstEventForFirstDraw == null) {
-            mTimeOfFirstEventForFirstDraw = time;
-        } else {
-            RecordHistogram.recordTimesHistogram(
-                    String.format(
-                            "%s.%s.%s",
-                            UMA_PREFIX,
-                            UMA_FONTS_RETRIEVED_BEFORE_FIRST_DRAW,
-                            mActivityNameForFirstDraw),
-                    time - mTimeOfFirstEventForFirstDraw);
-            // Also record one without the activity name for aggregation across all activities.
-            RecordHistogram.recordTimesHistogram(
-                    String.format("%s.%s", UMA_PREFIX, UMA_FONTS_RETRIEVED_BEFORE_FIRST_DRAW),
-                    time - mTimeOfFirstEventForFirstDraw);
-        }
-    }
-
-    private void onAllFontsRetrieved() {
-        final long time = SystemClock.elapsedRealtime();
-        RecordHistogram.recordTimesHistogram(
-                String.format("%s.%s", UMA_PREFIX, UMA_FONTS_RETRIEVED_AFTER_ON_CREATE),
-                time - mTimeOfLoadCall);
-
-        if (mTimeOfFirstEventForPostInflation == null) {
-            mTimeOfFirstEventForPostInflation = time;
-        } else {
-            RecordHistogram.recordTimesHistogram(
-                    String.format(
-                            "%s.%s.%s",
-                            UMA_PREFIX,
-                            UMA_FONTS_RETRIEVED_AFTER_INFLATION,
-                            mActivityNameForPostInflation),
-                    time - mTimeOfFirstEventForPostInflation);
-        }
-
-        if (mTimeOfFirstEventForFirstDraw == null) {
-            mTimeOfFirstEventForFirstDraw = time;
-        } else {
-            RecordHistogram.recordTimesHistogram(
-                    String.format(
-                            "%s.%s.%s",
-                            UMA_PREFIX,
-                            UMA_FONTS_RETRIEVED_AFTER_FIRST_DRAW,
-                            mActivityNameForFirstDraw),
-                    time - mTimeOfFirstEventForFirstDraw);
-            // Also record one without the activity name for aggregation across all activities.
-            RecordHistogram.recordTimesHistogram(
-                    String.format("%s.%s", UMA_PREFIX, UMA_FONTS_RETRIEVED_AFTER_FIRST_DRAW),
-                    time - mTimeOfFirstEventForFirstDraw);
-        }
-    }
-
-    private class OnFontCallback extends ResourcesCompat.FontCallback {
-        private int mNumberOfFontsRetrieved;
-
-        @Override
-        public void onFontRetrieved(@NonNull Typeface typeface) {
-            mThreadChecker.assertOnValidThread();
-            if (++mNumberOfFontsRetrieved == mFonts.length) {
-                onAllFontsRetrieved();
-            }
-        }
-
-        @Override
-        public void onFontRetrievalFailed(int reason) {}
-    }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/fonts/FontPreloaderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/fonts/FontPreloaderUnitTest.java
index 25e905c..7594985 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/fonts/FontPreloaderUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/fonts/FontPreloaderUnitTest.java
@@ -6,13 +6,11 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsInAnyOrder;
-import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.graphics.Typeface;
 import android.os.Handler;
-import android.os.SystemClock;
 
 import androidx.core.content.res.ResourcesCompat;
 import androidx.core.content.res.ResourcesCompat.FontCallback;
@@ -28,9 +26,7 @@
 import org.robolectric.annotation.LooperMode;
 import org.robolectric.annotation.LooperMode.Mode;
 import org.robolectric.annotation.Resetter;
-import org.robolectric.shadows.ShadowSystemClock;
 
-import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.browser.fonts.FontPreloaderUnitTest.ShadowResourcesCompat;
 
@@ -41,7 +37,7 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(
         manifest = Config.NONE,
-        shadows = {ShadowSystemClock.class, ShadowResourcesCompat.class})
+        shadows = {ShadowResourcesCompat.class})
 @LooperMode(Mode.PAUSED)
 public class FontPreloaderUnitTest {
     private static final Integer[] FONTS = {
@@ -49,20 +45,6 @@
         org.chromium.chrome.R.font.chrome_google_sans_medium,
         org.chromium.chrome.R.font.chrome_google_sans_bold
     };
-    private static final String AFTER_ON_CREATE =
-            "Android.Fonts.TimeToRetrieveDownloadableFontsAfterOnCreate";
-    private static final String AFTER_INFLATION =
-            "Android.Fonts.TimeDownloadableFontsRetrievedAfterPostInflationStartup";
-    private static final String BEFORE_INFLATION =
-            "Android.Fonts.TimeDownloadableFontsRetrievedBeforePostInflationStartup";
-    private static final String BEFORE_FIRST_DRAW =
-            "Android.Fonts.TimeDownloadableFontsRetrievedBeforeFirstDraw";
-    private static final String AFTER_FIRST_DRAW =
-            "Android.Fonts.TimeDownloadableFontsRetrievedAfterFirstDraw";
-    private static final String FRE = ".FirstRunActivity";
-    private static final String TABBED = ".ChromeTabbedActivity";
-    private static final String CUSTOM_TAB = ".CustomTabActivity";
-    private static final int INITIAL_TIME = 1000;
 
     @Mock private Context mContext;
 
@@ -94,7 +76,6 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME);
         ShadowResourcesCompat.reset();
         when(mContext.getApplicationContext()).thenReturn(mContext);
         mFontPreloader = new FontPreloader(FONTS);
@@ -105,368 +86,4 @@
     public void testGetFontCalledForAllFontsInArray() {
         assertThat(ShadowResourcesCompat.sFontsRequested, containsInAnyOrder(FONTS));
     }
-
-    @Test
-    public void testAllFontsRetrievedAfterOnPostInflationStartup_FRE() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 100);
-        mFontPreloader.onPostInflationStartupFre();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 228);
-        fakeLoadAllFonts();
-
-        assertHistogramRecorded(AFTER_ON_CREATE, 228);
-        assertHistogramRecorded(AFTER_INFLATION + FRE, 128);
-        assertHistogramNotRecorded(BEFORE_INFLATION + FRE);
-        assertHistogramNotRecorded(BEFORE_INFLATION + TABBED);
-        assertHistogramNotRecorded(AFTER_INFLATION + TABBED);
-        assertHistogramNotRecorded(BEFORE_INFLATION + CUSTOM_TAB);
-        assertHistogramNotRecorded(AFTER_INFLATION + CUSTOM_TAB);
-    }
-
-    @Test
-    public void testAllFontsRetrievedAfterOnPostInflationStartup_Tabbed() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 100);
-        mFontPreloader.onPostInflationStartupTabbedActivity();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 200);
-        fakeLoadAllFonts();
-
-        assertHistogramRecorded(AFTER_ON_CREATE, 200);
-        assertHistogramRecorded(AFTER_INFLATION + TABBED, 100);
-        assertHistogramNotRecorded(BEFORE_INFLATION + TABBED);
-        assertHistogramNotRecorded(BEFORE_INFLATION + FRE);
-        assertHistogramNotRecorded(AFTER_INFLATION + FRE);
-        assertHistogramNotRecorded(BEFORE_INFLATION + CUSTOM_TAB);
-        assertHistogramNotRecorded(AFTER_INFLATION + CUSTOM_TAB);
-    }
-
-    @Test
-    public void testAllFontsRetrievedAfterOnPostInflationStartup_CustomTab() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 100);
-        mFontPreloader.onPostInflationStartupCustomTabActivity();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 150);
-        fakeLoadAllFonts();
-
-        assertHistogramRecorded(AFTER_ON_CREATE, 150);
-        assertHistogramRecorded(AFTER_INFLATION + CUSTOM_TAB, 50);
-        assertHistogramNotRecorded(BEFORE_INFLATION + CUSTOM_TAB);
-        assertHistogramNotRecorded(BEFORE_INFLATION + TABBED);
-        assertHistogramNotRecorded(AFTER_INFLATION + TABBED);
-        assertHistogramNotRecorded(BEFORE_INFLATION + FRE);
-        assertHistogramNotRecorded(AFTER_INFLATION + FRE);
-    }
-
-    @Test
-    public void testAllFontsRetrievedBeforeOnPostInflationStartup_FRE() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 150);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 200);
-        mFontPreloader.onPostInflationStartupFre();
-
-        assertHistogramRecorded(AFTER_ON_CREATE, 150);
-        assertHistogramRecorded(BEFORE_INFLATION + FRE, 50);
-        assertHistogramNotRecorded(BEFORE_INFLATION + TABBED);
-        assertHistogramNotRecorded(AFTER_INFLATION + TABBED);
-        assertHistogramNotRecorded(AFTER_INFLATION + FRE);
-        assertHistogramNotRecorded(BEFORE_INFLATION + CUSTOM_TAB);
-        assertHistogramNotRecorded(AFTER_INFLATION + CUSTOM_TAB);
-    }
-
-    @Test
-    public void testAllFontsRetrievedBeforeOnPostInflationStartup_Tabbed() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 5);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 555);
-        mFontPreloader.onPostInflationStartupTabbedActivity();
-
-        assertHistogramRecorded(AFTER_ON_CREATE, 5);
-        assertHistogramRecorded(BEFORE_INFLATION + TABBED, 550);
-        assertHistogramNotRecorded(AFTER_INFLATION + TABBED);
-        assertHistogramNotRecorded(BEFORE_INFLATION + FRE);
-        assertHistogramNotRecorded(AFTER_INFLATION + FRE);
-        assertHistogramNotRecorded(BEFORE_INFLATION + CUSTOM_TAB);
-        assertHistogramNotRecorded(AFTER_INFLATION + CUSTOM_TAB);
-    }
-
-    @Test
-    public void testAllFontsRetrievedBeforeOnPostInflationStartup_CustomTab() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 123);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 234);
-        mFontPreloader.onPostInflationStartupCustomTabActivity();
-
-        assertHistogramRecorded(AFTER_ON_CREATE, 123);
-        assertHistogramRecorded(BEFORE_INFLATION + CUSTOM_TAB, 111);
-        assertHistogramNotRecorded(AFTER_INFLATION + CUSTOM_TAB);
-        assertHistogramNotRecorded(BEFORE_INFLATION + FRE);
-        assertHistogramNotRecorded(AFTER_INFLATION + FRE);
-        assertHistogramNotRecorded(BEFORE_INFLATION + TABBED);
-        assertHistogramNotRecorded(AFTER_INFLATION + TABBED);
-    }
-
-    @Test
-    public void testHistogramsNotRecordedBeforeAllFontsLoaded() {
-        ShadowResourcesCompat.loadFont();
-        ShadowResourcesCompat.loadFont();
-
-        assertHistogramNotRecorded(AFTER_ON_CREATE);
-        assertHistogramNotRecorded(BEFORE_INFLATION + TABBED);
-        assertHistogramNotRecorded(AFTER_INFLATION + TABBED);
-        assertHistogramNotRecorded(BEFORE_INFLATION + FRE);
-        assertHistogramNotRecorded(AFTER_INFLATION + FRE);
-        assertHistogramNotRecorded(BEFORE_INFLATION + CUSTOM_TAB);
-        assertHistogramNotRecorded(AFTER_INFLATION + CUSTOM_TAB);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + TABBED);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + TABBED);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + CUSTOM_TAB);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + CUSTOM_TAB);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW);
-
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 500);
-        ShadowResourcesCompat.loadFont();
-
-        assertHistogramRecorded(AFTER_ON_CREATE, 500);
-    }
-
-    @Test
-    public void testHistogramRecordedForOnlyFirstActivity_BeforeFREInflation() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 10);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 20);
-        mFontPreloader.onPostInflationStartupFre();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 30);
-        mFontPreloader.onPostInflationStartupTabbedActivity();
-
-        assertHistogramRecorded(BEFORE_INFLATION + FRE, 10);
-        assertHistogramNotRecorded(BEFORE_INFLATION + TABBED);
-    }
-
-    @Test
-    public void testHistogramRecordedForOnlyFirstActivity_AfterFREInflation() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 64);
-        mFontPreloader.onPostInflationStartupFre();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 96);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 128);
-        mFontPreloader.onPostInflationStartupTabbedActivity();
-
-        assertHistogramRecorded(AFTER_INFLATION + FRE, 32);
-        assertHistogramNotRecorded(BEFORE_INFLATION + TABBED);
-    }
-
-    @Test
-    public void testHistogramRecordedForOnlyFirstActivity_BeforeCctInflation() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 1);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 11);
-        mFontPreloader.onPostInflationStartupCustomTabActivity();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 111);
-        mFontPreloader.onPostInflationStartupTabbedActivity();
-
-        assertHistogramRecorded(BEFORE_INFLATION + CUSTOM_TAB, 10);
-        assertHistogramNotRecorded(BEFORE_INFLATION + TABBED);
-    }
-
-    @Test
-    public void testHistogramRecordedForOnlyFirstActivity_AfterCctInflation() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 32);
-        mFontPreloader.onPostInflationStartupCustomTabActivity();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 64);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 128);
-        mFontPreloader.onPostInflationStartupTabbedActivity();
-
-        assertHistogramRecorded(AFTER_INFLATION + CUSTOM_TAB, 32);
-        assertHistogramNotRecorded(BEFORE_INFLATION + TABBED);
-    }
-
-    @Test
-    public void testHistogramNotOverEmittedForExtraFontLoads() {
-        mFontPreloader.onPostInflationStartupTabbedActivity();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 10);
-        fakeLoadAllFonts();
-
-        assertHistogramRecorded(AFTER_ON_CREATE, 10);
-        assertHistogramRecorded(AFTER_INFLATION + TABBED, 10);
-
-        // Load an extra font
-        ShadowResourcesCompat.loadFont();
-        // Still should have only 1 record.
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 10);
-        assertHistogramRecorded(AFTER_INFLATION + TABBED, 10);
-    }
-
-    @Test
-    public void testAllFontsRetrievedAfterFirstDraw_FRE() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 100);
-        mFontPreloader.onFirstDrawFre();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 228);
-        fakeLoadAllFonts();
-
-        assertHistogramRecorded(AFTER_FIRST_DRAW, 128);
-        assertHistogramRecorded(AFTER_FIRST_DRAW + FRE, 128);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + TABBED);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + TABBED);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + CUSTOM_TAB);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + CUSTOM_TAB);
-    }
-
-    @Test
-    public void testAllFontsRetrievedAfterFirstDraw_Tabbed() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 100);
-        mFontPreloader.onFirstDrawTabbedActivity();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 113);
-        fakeLoadAllFonts();
-
-        assertHistogramRecorded(AFTER_FIRST_DRAW, 13);
-        assertHistogramRecorded(AFTER_FIRST_DRAW + TABBED, 13);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + TABBED);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + CUSTOM_TAB);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + CUSTOM_TAB);
-    }
-
-    @Test
-    public void testAllFontsRetrievedAfterFirstDraw_CustomTab() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 50);
-        mFontPreloader.onFirstDrawCustomTabActivity();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 100);
-        fakeLoadAllFonts();
-
-        assertHistogramRecorded(AFTER_FIRST_DRAW, 50);
-        assertHistogramRecorded(AFTER_FIRST_DRAW + CUSTOM_TAB, 50);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + CUSTOM_TAB);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + TABBED);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + TABBED);
-    }
-
-    @Test
-    public void testAllFontsRetrievedBeforeFirstDraw_FRE() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 90);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 100);
-        mFontPreloader.onFirstDrawFre();
-
-        assertHistogramRecorded(BEFORE_FIRST_DRAW, 10);
-        assertHistogramRecorded(BEFORE_FIRST_DRAW + FRE, 10);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + TABBED);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + TABBED);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + CUSTOM_TAB);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + CUSTOM_TAB);
-    }
-
-    @Test
-    public void testAllFontsRetrievedBeforeFirstDraw_Tabbed() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 123);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 246);
-        mFontPreloader.onFirstDrawTabbedActivity();
-
-        assertHistogramRecorded(BEFORE_FIRST_DRAW, 123);
-        assertHistogramRecorded(BEFORE_FIRST_DRAW + TABBED, 123);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + TABBED);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + CUSTOM_TAB);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + CUSTOM_TAB);
-    }
-
-    @Test
-    public void testAllFontsRetrievedBeforeFirstDraw_CustomTab() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 100);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 119);
-        mFontPreloader.onFirstDrawCustomTabActivity();
-
-        assertHistogramRecorded(BEFORE_FIRST_DRAW, 19);
-        assertHistogramRecorded(BEFORE_FIRST_DRAW + CUSTOM_TAB, 19);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + CUSTOM_TAB);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + FRE);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + TABBED);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + TABBED);
-    }
-
-    @Test
-    public void testHistogramRecordedForOnlyFirstActivity_BeforeFREDraw() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 10);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 20);
-        mFontPreloader.onFirstDrawFre();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 30);
-        mFontPreloader.onFirstDrawTabbedActivity();
-
-        assertHistogramRecorded(BEFORE_FIRST_DRAW + FRE, 10);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + TABBED);
-    }
-
-    @Test
-    public void testHistogramRecordedForOnlyFirstActivity_AfterFREDraw() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 10);
-        mFontPreloader.onFirstDrawFre();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 20);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 30);
-        mFontPreloader.onFirstDrawTabbedActivity();
-
-        assertHistogramRecorded(AFTER_FIRST_DRAW + FRE, 10);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + TABBED);
-    }
-
-    @Test
-    public void testHistogramRecordedForOnlyFirstActivity_BeforeCctDraw() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 100);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 200);
-        mFontPreloader.onFirstDrawCustomTabActivity();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 300);
-        mFontPreloader.onFirstDrawTabbedActivity();
-
-        assertHistogramRecorded(BEFORE_FIRST_DRAW + CUSTOM_TAB, 100);
-        assertHistogramNotRecorded(BEFORE_FIRST_DRAW + TABBED);
-    }
-
-    @Test
-    public void testHistogramRecordedForOnlyFirstActivity_AfterCctDraw() {
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 111);
-        mFontPreloader.onFirstDrawCustomTabActivity();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 222);
-        fakeLoadAllFonts();
-        SystemClock.setCurrentTimeMillis(INITIAL_TIME + 300);
-        mFontPreloader.onFirstDrawTabbedActivity();
-
-        assertHistogramRecorded(AFTER_FIRST_DRAW + CUSTOM_TAB, 111);
-        assertHistogramNotRecorded(AFTER_FIRST_DRAW + TABBED);
-    }
-
-    private void fakeLoadAllFonts() {
-        for (int i = 0; i < 3; i++) {
-            ShadowResourcesCompat.loadFont();
-        }
-    }
-
-    /**
-     * @param histogram Histogram name to assert.
-     * @param expectedValue The expected value to be recorded.
-     */
-    private void assertHistogramRecorded(String histogram, int expectedValue) {
-        assertEquals(
-                histogram + " isn't recorded correctly.",
-                1,
-                RecordHistogram.getHistogramValueCountForTesting(histogram, expectedValue));
-    }
-
-    /** @param histogram Histogram name to assert. */
-    private void assertHistogramNotRecorded(String histogram) {
-        assertEquals(
-                histogram + " shouldn't be recorded.",
-                0,
-                RecordHistogram.getHistogramTotalCountForTesting(histogram));
-    }
 }
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index fa37153..bc1e4d57 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -5792,10 +5792,6 @@
     {"feed-v2-hearts", flag_descriptions::kInterestFeedV2HeartsName,
      flag_descriptions::kInterestFeedV2HeartsDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(feed::kInterestFeedV2Hearts)},
-    {"info-card-acknowledgement-tracking",
-     flag_descriptions::kInfoCardAcknowledgementTrackingName,
-     flag_descriptions::kInfoCardAcknowledgementTrackingDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(feed::kInfoCardAcknowledgementTracking)},
     {"web-feed-awareness", flag_descriptions::kWebFeedAwarenessName,
      flag_descriptions::kWebFeedAwarenessDescription, kOsAndroid,
      FEATURE_WITH_PARAMS_VALUE_TYPE(feed::kWebFeedAwareness,
diff --git a/chrome/browser/android/autocomplete/tab_matcher_android.cc b/chrome/browser/android/autocomplete/tab_matcher_android.cc
index 051071c..935220a 100644
--- a/chrome/browser/android/autocomplete/tab_matcher_android.cc
+++ b/chrome/browser/android/autocomplete/tab_matcher_android.cc
@@ -38,8 +38,7 @@
 
   void UpdateStrippedURL(const GURL& url,
                          const TemplateURLService* template_url_service,
-                         const bool keep_search_intent_params,
-                         const bool normalize_search_terms) {
+                         const bool keep_search_intent_params) {
     initialized_ = true;
     if (url.is_valid()) {
       // Use a blank input as the stripped URL will be reused with other inputs.
@@ -49,7 +48,7 @@
       // plain-text SRPs.
       stripped_url_ = AutocompleteMatch::GURLToStrippedGURL(
           url, AutocompleteInput(), template_url_service, std::u16string(),
-          keep_search_intent_params, normalize_search_terms);
+          keep_search_intent_params);
     }
   }
 
@@ -88,13 +87,11 @@
   // SRPs.
   const bool keep_search_intent_params = base::FeatureList::IsEnabled(
       omnibox::kDisambiguateTabMatchingForEntitySuggestions);
-  const bool normalize_search_terms =
-      base::FeatureList::IsEnabled(omnibox::kNormalizeSearchSuggestions);
   const GURL stripped_url = AutocompleteMatch::GURLToStrippedGURL(
       url, *input, template_url_service_, std::u16string(),
-      keep_search_intent_params, normalize_search_terms);
-  const auto all_tabs = GetAllHiddenAndNonCCTTabInfos(
-      input, keep_search_intent_params, normalize_search_terms);
+      keep_search_intent_params);
+  const auto all_tabs =
+      GetAllHiddenAndNonCCTTabInfos(input, keep_search_intent_params);
   return all_tabs.find(stripped_url) != all_tabs.end();
 }
 
@@ -108,15 +105,13 @@
 
   const bool keep_search_intent_params = base::FeatureList::IsEnabled(
       omnibox::kDisambiguateTabMatchingForEntitySuggestions);
-  const bool normalize_search_terms =
-      base::FeatureList::IsEnabled(omnibox::kNormalizeSearchSuggestions);
-  auto all_tabs = GetAllHiddenAndNonCCTTabInfos(
-      input, keep_search_intent_params, normalize_search_terms);
+  auto all_tabs =
+      GetAllHiddenAndNonCCTTabInfos(input, keep_search_intent_params);
 
   for (auto& gurl_to_tab_info : *map) {
     const GURL stripped_url = AutocompleteMatch::GURLToStrippedGURL(
         gurl_to_tab_info.first, *input, template_url_service_, std::u16string(),
-        keep_search_intent_params, normalize_search_terms);
+        keep_search_intent_params);
     auto found_tab = all_tabs.find(stripped_url);
     if (found_tab != all_tabs.end()) {
       gurl_to_tab_info.second = found_tab->second;
@@ -195,8 +190,7 @@
 
 TabMatcher::GURLToTabInfoMap TabMatcherAndroid::GetAllHiddenAndNonCCTTabInfos(
     const AutocompleteInput* input,
-    const bool keep_search_intent_params,
-    const bool normalize_search_terms) const {
+    const bool keep_search_intent_params) const {
   using chrome::android::ActivityType;
   GURLToTabInfoMap tab_infos;
   JNIEnv* env = base::android::AttachCurrentThread();
@@ -210,8 +204,7 @@
     DCHECK(user_data);
     if (!user_data->IsInitialized()) {
       user_data->UpdateStrippedURL(tab->GetURL(), template_url_service_,
-                                   keep_search_intent_params,
-                                   normalize_search_terms);
+                                   keep_search_intent_params);
     }
 
     const GURL& tab_stripped_url = user_data->GetStrippedURL();
diff --git a/chrome/browser/android/autocomplete/tab_matcher_android.h b/chrome/browser/android/autocomplete/tab_matcher_android.h
index e5da0b8..af04bf3 100644
--- a/chrome/browser/android/autocomplete/tab_matcher_android.h
+++ b/chrome/browser/android/autocomplete/tab_matcher_android.h
@@ -34,8 +34,7 @@
       const AutocompleteInput* input) const;
   GURLToTabInfoMap GetAllHiddenAndNonCCTTabInfos(
       const AutocompleteInput* input,
-      const bool keep_search_intent_params,
-      const bool normalize_search_terms) const;
+      const bool keep_search_intent_params) const;
 
   raw_ptr<const TemplateURLService> template_url_service_;
   raw_ptr<Profile> profile_;
diff --git a/chrome/browser/ash/login/chrome_restart_request.cc b/chrome/browser/ash/login/chrome_restart_request.cc
index d6c1b65..bab5078 100644
--- a/chrome/browser/ash/login/chrome_restart_request.cc
+++ b/chrome/browser/ash/login/chrome_restart_request.cc
@@ -223,7 +223,6 @@
       switches::kForceTabletPowerButton,
       switches::kFormFactor,
       switches::kHasChromeOSKeyboard,
-      switches::kLacrosChromePath,
       ash::standalone_browser::kLacrosStabilitySwitch,
       switches::kLoginProfile,
       switches::kNaturalScrollDefault,
@@ -252,7 +251,6 @@
   auto kForwardFeatures = {
       &features::kAutoNightLight,
       &ash::features::kSeamlessRefreshRateSwitching,
-      &ash::standalone_browser::features::kLacrosOnly,
       &::features::kPluginVm,
       &display::features::kCtmColorManagement,
       &display::features::kOledScaleFactorEnabled,
diff --git a/chrome/browser/ash/preferences/preferences.cc b/chrome/browser/ash/preferences/preferences.cc
index 59627d0..9c61dcaa 100644
--- a/chrome/browser/ash/preferences/preferences.cc
+++ b/chrome/browser/ash/preferences/preferences.cc
@@ -597,6 +597,8 @@
 
   registry->RegisterIntegerPref(prefs::kHMRConsentWindowDismissCount, 0);
 
+  registry->RegisterIntegerPref(prefs::kGenAIPhotoEditingSettings, 0);
+
   registry->RegisterBooleanPref(
       prefs::kLauncherResultEverLaunched, false,
       user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF);
diff --git a/chrome/browser/ash/system_web_apps/apps/mall_app_integration_browsertest.cc b/chrome/browser/ash/system_web_apps/apps/mall_app_integration_browsertest.cc
index 2e03570b..cdbef5d 100644
--- a/chrome/browser/ash/system_web_apps/apps/mall_app_integration_browsertest.cc
+++ b/chrome/browser/ash/system_web_apps/apps/mall_app_integration_browsertest.cc
@@ -30,9 +30,10 @@
     constexpr char kScript[] = R"js(
       new Promise((resolve, reject) => {
         let intervalId = setInterval(() => {
-          if (document.querySelector("iframe")) {
+          const src = document.querySelector("iframe")?.src;
+          if (src) {
             clearInterval(intervalId);
-            resolve(document.querySelector("iframe").src);
+            resolve(src);
           }
         }, 50);
       });
@@ -61,7 +62,7 @@
   EXPECT_THAT(
       GetMallEmbedUrl(contents),
       testing::StartsWith(
-          "https://discover.apps.chrome/?chrome%3A%2F%2Fmall&context="));
+          "https://discover.apps.chrome/?origin=chrome%3A%2F%2Fmall&context="));
 }
 
 IN_PROC_BROWSER_TEST_P(MallAppIntegrationTest, EmbedMallWithDeepLink) {
@@ -75,7 +76,7 @@
 
   EXPECT_THAT(GetMallEmbedUrl(contents),
               testing::StartsWith("https://discover.apps.chrome/apps/"
-                                  "list?chrome%3A%2F%2Fmall&context="));
+                                  "list?origin=chrome%3A%2F%2Fmall&context="));
 }
 
 INSTANTIATE_SYSTEM_WEB_APP_MANAGER_TEST_SUITE_REGULAR_PROFILE_P(
diff --git a/chrome/browser/ash/system_web_apps/apps/mall_system_web_app_info.cc b/chrome/browser/ash/system_web_apps/apps/mall_system_web_app_info.cc
index 1a9f71f..6b6a752 100644
--- a/chrome/browser/ash/system_web_apps/apps/mall_system_web_app_info.cc
+++ b/chrome/browser/ash/system_web_apps/apps/mall_system_web_app_info.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ash/system_web_apps/apps/mall_system_web_app_info.h"
 
+#include "ash/constants/ash_switches.h"
 #include "ash/constants/web_app_id_constants.h"
 #include "ash/webui/grit/ash_mall_cros_app_resources.h"
 #include "ash/webui/mall/url_constants.h"
@@ -56,6 +57,10 @@
       !base::FeatureList::IsEnabled(chromeos::features::kCrosMallManaged)) {
     return false;
   }
+  // Do not enable Mall on Flex devices, which do  not support apps on ARC.
+  if (ash::switches::IsRevenBranding()) {
+    return false;
+  }
   return chromeos::features::IsCrosMallSwaEnabled();
 }
 
diff --git a/chrome/browser/ash/system_web_apps/apps/media_app/media_app_guest_ui_config.cc b/chrome/browser/ash/system_web_apps/apps/media_app/media_app_guest_ui_config.cc
index a4b1670..f434e33 100644
--- a/chrome/browser/ash/system_web_apps/apps/media_app/media_app_guest_ui_config.cc
+++ b/chrome/browser/ash/system_web_apps/apps/media_app/media_app_guest_ui_config.cc
@@ -121,6 +121,11 @@
   source->AddBoolean("isDevChannel", channel == version_info::Channel::DEV);
 }
 
+PrefService* ChromeMediaAppGuestUIDelegate::GetPrefService(
+    content::WebUI* web_ui) {
+  return Profile::FromWebUI(web_ui)->GetPrefs();
+}
+
 void ChromeMediaAppGuestUIDelegate::CreateAndBindOcrUntrustedService(
     content::BrowserContext& context,
     gfx::NativeWindow native_window,
diff --git a/chrome/browser/ash/system_web_apps/apps/media_app/media_app_guest_ui_config.h b/chrome/browser/ash/system_web_apps/apps/media_app/media_app_guest_ui_config.h
index 01b5cdd1..4047066f 100644
--- a/chrome/browser/ash/system_web_apps/apps/media_app/media_app_guest_ui_config.h
+++ b/chrome/browser/ash/system_web_apps/apps/media_app/media_app_guest_ui_config.h
@@ -8,6 +8,7 @@
 #include "ash/webui/media_app_ui/media_app_guest_ui.h"
 #include "ash/webui/media_app_ui/media_app_ui_untrusted.mojom.h"
 #include "chrome/browser/accessibility/media_app/ax_media_app_untrusted_service.h"
+#include "components/prefs/pref_service.h"
 #include "content/public/browser/webui_config.h"
 
 namespace content {
@@ -24,9 +25,12 @@
   ChromeMediaAppGuestUIDelegate(const ChromeMediaAppGuestUIDelegate&) = delete;
   ChromeMediaAppGuestUIDelegate& operator=(
       const ChromeMediaAppGuestUIDelegate&) = delete;
+
+  static void RegisterProfilePrefs(PrefRegistrySimple* registry);
+
   void PopulateLoadTimeData(content::WebUI* web_ui,
                             content::WebUIDataSource* source) override;
-  static void RegisterProfilePrefs(PrefRegistrySimple* registry);
+  PrefService* GetPrefService(content::WebUI* web_ui) override;
   void CreateAndBindOcrUntrustedService(
       content::BrowserContext& context,
       gfx::NativeWindow native_window,
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
index 6de9eca..4aa1772c 100644
--- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
+++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
@@ -502,12 +502,10 @@
   const TemplateURLService* template_url_service = GetTemplateURLService();
   return AutocompleteMatch::GURLToStrippedGURL(
              url1, *input, template_url_service, std::u16string(),
-             /*keep_search_intent_params=*/false,
-             /*normalize_search_terms=*/false) ==
+             /*keep_search_intent_params=*/false) ==
          AutocompleteMatch::GURLToStrippedGURL(
              url2, *input, template_url_service, std::u16string(),
-             /*keep_search_intent_params=*/false,
-             /*normalize_search_terms=*/false);
+             /*keep_search_intent_params=*/false);
 }
 
 void ChromeAutocompleteProviderClient::OpenSharingHub() {
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc
index 1224a601..a8fae20f 100644
--- a/chrome/browser/autocomplete/search_provider_unittest.cc
+++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -1088,16 +1088,9 @@
   ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(u"f", &wyt_match));
   ASSERT_EQ(2u, provider_->matches().size());
   AutocompleteMatch term_match;
-  if (base::FeatureList::IsEnabled(omnibox::kNormalizeSearchSuggestions)) {
-    EXPECT_TRUE(FindMatchWithDestination(
-        GURL(base::ToLowerASCII(term_url.spec())), &term_match));
-    EXPECT_EQ(u"foo", term_match.fill_into_edit);
-    EXPECT_EQ(u"oo", term_match.inline_autocompletion);
-  } else {
-    EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
-    EXPECT_EQ(u"FOO", term_match.fill_into_edit);
-    EXPECT_EQ(u"OO", term_match.inline_autocompletion);
-  }
+  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
+  EXPECT_EQ(u"FOO", term_match.fill_into_edit);
+  EXPECT_EQ(u"OO", term_match.inline_autocompletion);
   EXPECT_GT(term_match.relevance, wyt_match.relevance);
   EXPECT_TRUE(term_match.allowed_to_be_default_match);
   // Make sure the case doesn't affect the highlighting.
diff --git a/chrome/browser/autocomplete/tab_matcher_desktop.cc b/chrome/browser/autocomplete/tab_matcher_desktop.cc
index 94b5c3f..b37c2fc96 100644
--- a/chrome/browser/autocomplete/tab_matcher_desktop.cc
+++ b/chrome/browser/autocomplete/tab_matcher_desktop.cc
@@ -27,8 +27,7 @@
       int last_committed_index,
       const GURL& last_committed_url,
       const TemplateURLService* template_url_service,
-      const bool keep_search_intent_params,
-      const bool normalize_search_terms) {
+      const bool keep_search_intent_params) {
     if (last_committed_url.is_valid()) {
       last_committed_entry_index_ = last_committed_index;
       // Use a blank input as the stripped URL will be reused with other inputs.
@@ -38,7 +37,7 @@
       // plain-text SRPs.
       last_committed_stripped_url_ = AutocompleteMatch::GURLToStrippedGURL(
           last_committed_url, AutocompleteInput(), template_url_service,
-          std::u16string(), keep_search_intent_params, normalize_search_terms);
+          std::u16string(), keep_search_intent_params);
     }
   }
 
@@ -74,15 +73,12 @@
   // SRPs.
   const bool keep_search_intent_params = base::FeatureList::IsEnabled(
       omnibox::kDisambiguateTabMatchingForEntitySuggestions);
-  const bool normalize_search_terms =
-      base::FeatureList::IsEnabled(omnibox::kNormalizeSearchSuggestions);
   const GURL stripped_url = AutocompleteMatch::GURLToStrippedGURL(
       url, *input, template_url_service_, std::u16string(),
-      keep_search_intent_params, normalize_search_terms);
+      keep_search_intent_params);
   for (auto* web_contents : GetOpenWebContents()) {
     if (IsStrippedURLEqualToWebContentsURL(stripped_url, web_contents,
-                                           keep_search_intent_params,
-                                           normalize_search_terms)) {
+                                           keep_search_intent_params)) {
       return true;
     }
   }
@@ -126,8 +122,7 @@
 bool TabMatcherDesktop::IsStrippedURLEqualToWebContentsURL(
     const GURL& stripped_url,
     content::WebContents* web_contents,
-    const bool keep_search_intent_params,
-    const bool normalize_search_terms) const {
+    const bool keep_search_intent_params) const {
   AutocompleteClientWebContentsUserData::CreateForWebContents(web_contents);
   AutocompleteClientWebContentsUserData* user_data =
       AutocompleteClientWebContentsUserData::FromWebContents(web_contents);
@@ -137,7 +132,7 @@
     user_data->UpdateLastCommittedStrippedURL(
         web_contents->GetController().GetLastCommittedEntryIndex(),
         web_contents->GetLastCommittedURL(), template_url_service_,
-        keep_search_intent_params, normalize_search_terms);
+        keep_search_intent_params);
   }
   return stripped_url == user_data->GetLastCommittedStrippedURL();
 }
diff --git a/chrome/browser/autocomplete/tab_matcher_desktop.h b/chrome/browser/autocomplete/tab_matcher_desktop.h
index 9fcac4d..eeba6214 100644
--- a/chrome/browser/autocomplete/tab_matcher_desktop.h
+++ b/chrome/browser/autocomplete/tab_matcher_desktop.h
@@ -30,8 +30,7 @@
   bool IsStrippedURLEqualToWebContentsURL(
       const GURL& stripped_url,
       content::WebContents* web_contents,
-      const bool keep_search_intent_params,
-      const bool normalize_search_terms) const;
+      const bool keep_search_intent_params) const;
 
   raw_ptr<const TemplateURLService> template_url_service_;
   raw_ptr<Profile> profile_ = nullptr;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 10517172..d8a79ad 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -5566,14 +5566,6 @@
     "expiry_milestone": 140
   },
   {
-    "name": "lacros-only",
-    "owners": [ "hidehiko@chromium.org", "erikchen@chromium.org", "lacros-team@google.com" ],
-    // Once Lacros is launched, this flag can be removed. Until then, this
-    // absolutely must not expire. We do not yet have a launch milestone.
-    // TODO(crbug.com/40157060).
-    "expiry_milestone": 140
-  },
-  {
     "name": "lacros-profile-migration-force-off",
     "owners": ["ythjkt@chromium.org", "hidehiko@chromium.org", "lacros-team@google.com"],
     // Once Lacros is launched, this flag can be removed. Until then, this
@@ -6852,7 +6844,7 @@
   },
   {
     "name": "password-form-grouped-affiliations",
-    "owners": ["atsvirchkova@google.com", "shaikhitdin@google.com", "chrome-password-manager-team@google.com"],
+    "owners": ["atsvirchkova@google.com", "vsemeniuk@google.com", "chrome-password-manager-team@google.com"],
     "expiry_milestone": 135
   },
   {
@@ -9127,12 +9119,12 @@
   },
   {
     "name": "username-first-flow-with-intermediate-values-predictions",
-    "owners": [ "kazinova@google.com", "shaikhitdin@google.com" ],
+    "owners": [ "kazinova@google.com", "vasilii@chromium.org" ],
     "expiry_milestone": 135
   },
   {
     "name": "username-first-flow-with-intermediate-values-voting",
-    "owners": [ "kazinova@google.com", "shaikhitdin@google.com" ],
+    "owners": [ "kazinova@google.com", "vasilii@chromium.org" ],
     "expiry_milestone": 135
   },
   {
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 335648a..27a8bfa 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -4690,11 +4690,6 @@
 const char kRefreshFeedOnRestartDescription[] =
     "Refresh feed when Chrome restarts.";
 
-const char kInfoCardAcknowledgementTrackingName[] =
-    "Info card acknowledgement tracking";
-const char kInfoCardAcknowledgementTrackingDescription[] =
-    "Enable acknowledgement tracking for info cards.";
-
 const char kInterestFeedV2Name[] = "Interest Feed v2";
 const char kInterestFeedV2Description[] =
     "Show content suggestions on the New Tab Page and Start Surface using the "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 74b20377..a8d9305 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2719,9 +2719,6 @@
 extern const char kRefreshFeedOnRestartName[];
 extern const char kRefreshFeedOnRestartDescription[];
 
-extern const char kInfoCardAcknowledgementTrackingName[];
-extern const char kInfoCardAcknowledgementTrackingDescription[];
-
 extern const char kInterestFeedV2Name[];
 extern const char kInterestFeedV2Description[];
 
diff --git a/chrome/browser/media/media_engagement_contents_observer.cc b/chrome/browser/media/media_engagement_contents_observer.cc
index f486ef1..fe2c1f8 100644
--- a/chrome/browser/media/media_engagement_contents_observer.cc
+++ b/chrome/browser/media/media_engagement_contents_observer.cc
@@ -487,25 +487,9 @@
                                                : handle->GetRenderFrameHost()
                                                      ->GetOutermostMainFrame()
                                                      ->GetLastCommittedURL());
-  MediaEngagementScore score = service_->CreateEngagementScore(origin);
-  bool has_high_engagement = score.high_score();
-
-  if (base::FeatureList::IsEnabled(media::kMediaEngagementHTTPSOnly))
-    DCHECK(!has_high_engagement || (origin.scheme() == url::kHttpsScheme));
-
-  // If the preloaded feature flag is enabled and the number of visits is less
-  // than the number of visits required to have an MEI score we should check the
-  // global data.
-  if (!has_high_engagement &&
-      score.visits() < MediaEngagementScore::GetScoreMinVisits() &&
-      base::FeatureList::IsEnabled(media::kPreloadMediaEngagementData)) {
-    has_high_engagement =
-        MediaEngagementPreloadedList::GetInstance()->CheckOriginIsPresent(
-            origin);
-  }
 
   // If we have high media engagement then we should send that to Blink.
-  if (has_high_engagement) {
+  if (service_->HasHighEngagement(origin)) {
     SendEngagementLevelToFrame(url::Origin::Create(handle->GetURL()),
                                handle->GetRenderFrameHost());
   }
diff --git a/chrome/browser/media/media_engagement_service.cc b/chrome/browser/media/media_engagement_service.cc
index 8a14493..d697598 100644
--- a/chrome/browser/media/media_engagement_service.cc
+++ b/chrome/browser/media/media_engagement_service.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/media/media_engagement_contents_observer.h"
+#include "chrome/browser/media/media_engagement_preloaded_list.h"
 #include "chrome/browser/media/media_engagement_score.h"
 #include "chrome/browser/media/media_engagement_service_factory.h"
 #include "chrome/browser/preloading/prefetch/no_state_prefetch/chrome_no_state_prefetch_contents_delegate.h"
@@ -256,7 +257,26 @@
 
 bool MediaEngagementService::HasHighEngagement(
     const url::Origin& origin) const {
-  return CreateEngagementScore(origin).high_score();
+  MediaEngagementScore score = CreateEngagementScore(origin);
+  bool has_high_engagement = score.high_score();
+  if (has_high_engagement) {
+    return true;
+  }
+
+  if (base::FeatureList::IsEnabled(media::kMediaEngagementHTTPSOnly)) {
+    DCHECK(!has_high_engagement || (origin.scheme() == url::kHttpsScheme));
+  }
+
+  if (!base::FeatureList::IsEnabled(media::kPreloadMediaEngagementData)) {
+    return false;
+  }
+
+  if (score.visits() >= MediaEngagementScore::GetScoreMinVisits()) {
+    return false;
+  }
+
+  return MediaEngagementPreloadedList::GetInstance()->CheckOriginIsPresent(
+      origin);
 }
 
 std::map<url::Origin, double> MediaEngagementService::GetScoreMapForTesting()
diff --git a/chrome/browser/media/media_engagement_service.h b/chrome/browser/media/media_engagement_service.h
index df72462..28898a96 100644
--- a/chrome/browser/media/media_engagement_service.h
+++ b/chrome/browser/media/media_engagement_service.h
@@ -60,7 +60,10 @@
   // Returns the engagement score of |origin|.
   double GetEngagementScore(const url::Origin& origin) const;
 
-  // Returns true if |origin| has an engagement score considered high.
+  // Returns true if `origin` has an engagement score considered high.
+  // Otherwise, check the global data (`MediaEngagementPreloadedList`) if the
+  // `kPreloadMediaEngagementData` feature flag is enabled and the number of
+  // visits is less than the number of visits required to have an MEI score.
   virtual bool HasHighEngagement(const url::Origin& origin) const;
 
   // Returns a map of all stored origins and their engagement levels.
diff --git a/chrome/browser/media/media_engagement_service_unittest.cc b/chrome/browser/media/media_engagement_service_unittest.cc
index 3e14222..7831c45 100644
--- a/chrome/browser/media/media_engagement_service_unittest.cc
+++ b/chrome/browser/media/media_engagement_service_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/functional/callback_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
+#include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/test/scoped_feature_list.h"
@@ -23,6 +24,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/history/history_service_factory.h"
+#include "chrome/browser/media/media_engagement_preloaded_list.h"
 #include "chrome/browser/media/media_engagement_score.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
@@ -51,6 +53,17 @@
 // History is automatically expired after 90 days.
 base::TimeDelta kHistoryExpirationThreshold = base::Days(90);
 
+const base::FilePath kTestDataPath = base::FilePath(
+    FILE_PATH_LITERAL("chrome/test/data/media/engagement/preload"));
+
+const base::FilePath kSampleDataPath = kTestDataPath.AppendASCII("test.pb");
+
+const base::FilePath kEmptyFilePath = kTestDataPath.AppendASCII("empty.pb");
+
+base::FilePath GeneratedTestDataRoot() {
+  return base::PathService::CheckedGet(base::DIR_GEN_TEST_DATA_ROOT);
+}
+
 // Waits until a change is observed in media engagement content settings.
 class MediaEngagementChangeWaiter : public content_settings::Observer {
  public:
@@ -151,6 +164,10 @@
 
     test_clock_.SetNow(GetReferenceTime());
     service_ = base::WrapUnique(StartNewMediaEngagementService());
+
+    // Start with an empty preloaded list during each test.
+    ASSERT_TRUE(MediaEngagementPreloadedList::GetInstance()->LoadFromFile(
+        GetAbsolutePathToGeneratedTestFile(kEmptyFilePath)));
   }
 
   MediaEngagementService* service() const { return service_.get(); }
@@ -297,6 +314,10 @@
     return GetAllStoredScores(service_.get());
   }
 
+  base::FilePath GetAbsolutePathToGeneratedTestFile(base::FilePath path) {
+    return GeneratedTestDataRoot().Append(path);
+  }
+
  protected:
   scoped_refptr<base::TestMockTimeTaskRunner> mock_time_task_runner_;
 
@@ -851,6 +872,66 @@
   EXPECT_FALSE(HasHighEngagement(origin3));
 }
 
+// Disable test on Android. Feature `kPreloadMediaEngagementData` is not
+// available for this platforms.
+#if BUILDFLAG(IS_ANDROID)
+#define MAYBE_HasHighEngagement_PreloadListOriginPresent \
+  DISABLED_HasHighEngagement_PreloadListOriginPresent
+#else
+#define MAYBE_HasHighEngagement_PreloadListOriginPresent \
+  HasHighEngagement_PreloadListOriginPresent
+#endif
+TEST_P(MediaEngagementServiceTest,
+       MAYBE_HasHighEngagement_PreloadListOriginPresent) {
+  url::Origin origin = url::Origin::Create(GURL("https://google.com"));
+  EXPECT_FALSE(HasHighEngagement(origin));
+
+  // Load Media Engagement Preloaded List.
+  EXPECT_TRUE(base::FeatureList::IsEnabled(media::kPreloadMediaEngagementData));
+  ASSERT_TRUE(MediaEngagementPreloadedList::GetInstance()->LoadFromFile(
+      GetAbsolutePathToGeneratedTestFile(kSampleDataPath)));
+
+  // Verify that `origin` has high engagement.
+  EXPECT_TRUE(HasHighEngagement(origin));
+}
+
+// Disable test on Android. Feature `kPreloadMediaEngagementData` is not
+// available for this platforms.
+#if BUILDFLAG(IS_ANDROID)
+#define MAYBE_HasHighEngagement_ScoreVisits \
+  DISABLED_HasHighEngagement_ScoreVisits
+#else
+#define MAYBE_HasHighEngagement_ScoreVisits HasHighEngagement_ScoreVisits
+#endif
+TEST_P(MediaEngagementServiceTest, MAYBE_HasHighEngagement_ScoreVisits) {
+  url::Origin origin = url::Origin::Create(GURL("https://google.com"));
+  EXPECT_FALSE(HasHighEngagement(origin));
+
+  // Load Media Engagement Preloaded List.
+  EXPECT_TRUE(base::FeatureList::IsEnabled(media::kPreloadMediaEngagementData));
+  ASSERT_TRUE(MediaEngagementPreloadedList::GetInstance()->LoadFromFile(
+      GetAbsolutePathToGeneratedTestFile(kSampleDataPath)));
+
+  // Verify that the `origin` has high engagement, since it is present in the
+  // list.
+  EXPECT_TRUE(HasHighEngagement(origin));
+
+  // Set the number of visits for `origin` to a value lower than the score min
+  // visits, and verify that the `origin` has high media engagement.
+  SetScores(origin, MediaEngagementScore::GetScoreMinVisits() - 1, 1);
+  EXPECT_TRUE(HasHighEngagement(origin));
+
+  // Set the number of visits for `origin` to the score min visits, and verify
+  // that the `origin` does not have high media engagement.
+  SetScores(origin, MediaEngagementScore::GetScoreMinVisits(), 1);
+  EXPECT_FALSE(HasHighEngagement(origin));
+
+  // Set the number of visits for `origin` to a value greater than the score min
+  // visits, and verify that the `origin` does not have high media engagement.
+  SetScores(origin, MediaEngagementScore::GetScoreMinVisits() + 1, 1);
+  EXPECT_FALSE(HasHighEngagement(origin));
+}
+
 TEST_P(MediaEngagementServiceTest, SchemaVersion_Changed) {
   url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
   SetScores(origin, 1, 2);
diff --git a/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc
index 5167ddc1..7d5954e 100644
--- a/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer_browsertest.cc
@@ -5,6 +5,7 @@
 #include "components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.h"
 
 #include "base/containers/contains.h"
+#include "base/time/time.h"
 #include "chrome/browser/page_load_metrics/integration_tests/metric_integration_test.h"
 #include "chrome/browser/preloading/prerender/prerender_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
@@ -695,15 +696,14 @@
   ASSERT_TRUE(
       content::NavigateToURL(web_contents(), GURL(url::kAboutBlankURL)));
 
-  histogram_tester().ExpectTotalCount(
-      prerender_helper_.GenerateHistogramName(
-          "PageLoad.Internal.Prerender2.DomContentLoadedToActivation",
-          content::PreloadingTriggerType::kSpeculationRule, ""),
-      1);
-  std::unique_ptr<base::HistogramSamples> samples =
-      histogram_tester().GetHistogramSamplesSinceCreation(
-          "PageLoad.Internal.Prerender2.DomContentLoadedToActivation");
-  EXPECT_GE(samples->sum(), 0);
+  std::string histogram_name = prerender_helper_.GenerateHistogramName(
+      "PageLoad.Internal.Prerender2.DomContentLoadedToActivation2",
+      content::PreloadingTriggerType::kSpeculationRule, "");
+  histogram_tester().ExpectTotalCount(histogram_name, 1);
+  // We shift the duration by the 1 minute when recording the metric.
+  base::TimeDelta shifting_duration = base::Minutes(1);
+  EXPECT_GE(histogram_tester().GetTotalSum(histogram_name),
+            shifting_duration.InMilliseconds());
 }
 
 IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
@@ -764,15 +764,14 @@
   // Flush metrics.
   ASSERT_TRUE(
       content::NavigateToURL(web_contents(), GURL(url::kAboutBlankURL)));
-  histogram_tester().ExpectTotalCount(
-      prerender_helper_.GenerateHistogramName(
-          "PageLoad.Internal.Prerender2.DomContentLoadedToActivation",
-          content::PreloadingTriggerType::kSpeculationRule, ""),
-      1);
-  std::unique_ptr<base::HistogramSamples> samples =
-      histogram_tester().GetHistogramSamplesSinceCreation(
-          "PageLoad.Internal.Prerender2.DomContentLoadedToActivation");
-  EXPECT_LE(samples->sum(), 0);
+  std::string histogram_name = prerender_helper_.GenerateHistogramName(
+      "PageLoad.Internal.Prerender2.DomContentLoadedToActivation2",
+      content::PreloadingTriggerType::kSpeculationRule, "");
+  histogram_tester().ExpectTotalCount(histogram_name, 1);
+  // We shift the duration by the 1 minute when recording the metric.
+  base::TimeDelta shifting_duration = base::Minutes(1);
+  EXPECT_LE(histogram_tester().GetTotalSum(histogram_name),
+            shifting_duration.InMilliseconds());
 }
 
 IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
diff --git a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper.cc b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper.cc
index b7147ee5..f287702 100644
--- a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper.cc
+++ b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper.cc
@@ -253,17 +253,17 @@
     return false;
   }
 
-  // The tab must either have playback or be using camera/microphone to autopip.
-  if (!MeetsVideoPlaybackConditions() && !IsUsingCameraOrMicrophone()) {
-    return false;
-  }
-
   // Only https:// or file:// may autopip.
   const GURL url = web_contents()->GetLastCommittedURL();
   if (!url.SchemeIs(url::kHttpsScheme) && !url.SchemeIsFile()) {
     return false;
   }
 
+  // The tab must either have playback or be using camera/microphone to autopip.
+  if (!MeetsVideoPlaybackConditions() && !IsUsingCameraOrMicrophone()) {
+    return false;
+  }
+
   // The website must have registered for autopip.
   if (!is_enter_auto_picture_in_picture_available_) {
     return false;
@@ -333,17 +333,21 @@
     return true;
   }
 
-  if (!media_engagement_service_) {
-    return false;
-  }
-
   std::optional<content::RenderFrameHost*> rfh = GetPrimaryMainRoutedFrame();
   if (!rfh) {
     return false;
   }
 
-  return media_engagement_service_->HasHighEngagement(
-      rfh.value()->GetLastCommittedOrigin());
+  const url::Origin origin = rfh.value()->GetLastCommittedOrigin();
+  if (origin.GetURL().SchemeIsFile()) {
+    return true;
+  }
+
+  if (!media_engagement_service_) {
+    return false;
+  }
+
+  return media_engagement_service_->HasHighEngagement(origin);
 }
 
 ContentSetting AutoPictureInPictureTabHelper::GetCurrentContentSetting() const {
diff --git a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc
index 09116e0..5418fc15 100644
--- a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc
+++ b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc
@@ -845,9 +845,15 @@
 
 IN_PROC_BROWSER_TEST_F(AutoPictureInPictureWithVideoPlaybackBrowserTest,
                        DoesNotVideoAutopip_LowEngagementScore) {
-  // Load a page that registers for autopip and start video playback.
-  LoadAutoVideoPipPage(browser());
+  // Load a page, with HTTPS scheme, that registers for autopip and start video
+  // playback.
+  ASSERT_TRUE(embedded_https_test_server().Start());
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(
+      browser(), embedded_https_test_server().GetURL(
+                     "a.com", "/media/picture-in-picture/autopip-video.html")));
+
   auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents->GetLastCommittedURL().SchemeIs(url::kHttpsScheme));
   PlayVideo(web_contents);
   WaitForAudioFocusGained();
   WaitForMediaSessionPlaying(web_contents);
@@ -859,6 +865,24 @@
 
 IN_PROC_BROWSER_TEST_F(
     AutoPictureInPictureWithVideoPlaybackBrowserTest,
+    DoesVideoAutopip_LowEngagementScoreAndUrlWithFileScheme) {
+  // Load a page, with file scheme, that registers for autopip and start video
+  // playback.
+  LoadAutoVideoPipPage(browser());
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents->GetLastCommittedURL().SchemeIsFile());
+  PlayVideo(web_contents);
+  WaitForAudioFocusGained();
+  WaitForMediaSessionPlaying(web_contents);
+  SetExpectedHasHighEngagement(false);
+  WaitForWasRecentlyAudible(web_contents);
+
+  SwitchToNewTabAndBackAndExpectAutopip(/*should_video_pip=*/true,
+                                        /*should_document_pip=*/false);
+}
+
+IN_PROC_BROWSER_TEST_F(
+    AutoPictureInPictureWithVideoPlaybackBrowserTest,
     DoesVideoAutopip_ContentSettingAllowAndLowEngagementScore) {
   // Load a page that registers for autopip and start video playback.
   LoadAutoVideoPipPage(browser());
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index a559272..baf44a2 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -1783,6 +1783,9 @@
   { key::kArcOpenLinksInBrowserByDefault,
     arc::prefs::kArcOpenLinksInBrowserByDefault,
     base::Value::Type::BOOLEAN },
+  { key::kGenAIPhotoEditingSettings,
+    ash::prefs::kGenAIPhotoEditingSettings,
+    base::Value::Type::INTEGER},
 #endif // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(IS_LINUX)
@@ -3264,6 +3267,8 @@
                                        ash::prefs::kGenAIVcBackgroundSettings);
   gen_ai_default_policies.emplace_back(key::kHelpMeReadSettings,
                                        ash::prefs::kHmrManagedSettings);
+  gen_ai_default_policies.emplace_back(key::kGenAIPhotoEditingSettings,
+                                       ash::prefs::kGenAIPhotoEditingSettings);
 #endif  // BUILDFLAG(IS_CHROMEOS)
   handlers->AddHandler(std::make_unique<GenAiDefaultSettingsPolicyHandler>(
       std::move(gen_ai_default_policies)));
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc b/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
index 846298f..819c796 100644
--- a/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
@@ -280,9 +280,8 @@
       report_error_callback_(std::move(report_error_callback)),
       network_traffic_annotation_(network_traffic_annotation),
       navigation_prefetch_(navigation_prefetch) {
-  DCHECK(streaming_prefetch_request_);
-  MarkPrefetchAsServable();
-  prefetch_url_ = resource_request->url;
+  CHECK(streaming_prefetch_request_);
+  streaming_prefetch_request_->MarkPrefetchAsServable();
 
   // Maybe proxies the prefetch URL loader via the Extension Web Request API, so
   // that extensions can be informed of any prefetches.
@@ -360,15 +359,6 @@
       std::move(loader));
 }
 
-void StreamingSearchPrefetchURLLoader::MarkPrefetchAsServable() {
-  if (marked_as_servable_) {
-    return;
-  }
-  DCHECK(streaming_prefetch_request_);
-  marked_as_servable_ = true;
-  streaming_prefetch_request_->MarkPrefetchAsServable();
-}
-
 void StreamingSearchPrefetchURLLoader::OnServableResponseCodeReceived() {
   // This means that the navigation stack is already running for the navigation
   // to this term, and chrome does not need to prerender.
@@ -378,15 +368,6 @@
   streaming_prefetch_request_->OnServableResponseCodeReceived();
 }
 
-void StreamingSearchPrefetchURLLoader::RecordNavigationURLHistogram(
-    const GURL& navigation_url) {
-  if (navigation_prefetch_) {
-    UMA_HISTOGRAM_BOOLEAN(
-        "Omnibox.SearchPrefetch.NavigationURLMatches.NavigationPrefetch",
-        (prefetch_url_ == navigation_url));
-  }
-}
-
 void StreamingSearchPrefetchURLLoader::SetUpForwardingClient(
     const network::ResourceRequest& resource_request,
     mojo::PendingReceiver<network::mojom::URLLoader> receiver,
@@ -406,8 +387,6 @@
   resource_request_ =
       std::make_unique<network::ResourceRequest>(resource_request);
 
-  RecordNavigationURLHistogram(resource_request_->url);
-
   // Let `this` own itself, so that it can manage its lifetime properly.
   self_pointer_ = WrapRefCounted(this);
   receiver_.Bind(std::move(receiver));
@@ -538,8 +517,6 @@
     return;
   }
 
-  MarkPrefetchAsServable();
-
   // Store head and pause new messages until the forwarding client is set up.
   resource_response_ = std::move(head);
 
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h b/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h
index fb2c5e5..799b50c 100644
--- a/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h
+++ b/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h
@@ -243,10 +243,6 @@
   // on mojo channels closing or other errors occurring.
   void ClearOwnerPointer();
 
-  // Record whether the navigation url and the |prefetch_url_| match. Only
-  // recorded when |navigation_prefetch_| is true.
-  void RecordNavigationURLHistogram(const GURL& navigation_url);
-
   void set_on_destruction_callback_for_testing(
       base::OnceClosure on_destruction_callback_for_testing) {
     on_destruction_callback_for_testing_ =
@@ -357,9 +353,6 @@
   // Forwards all queued events to |forwarding_client_|.
   void RunEventQueue();
 
-  // Marks the parent prefetch request as servable. Called as delayed task.
-  void MarkPrefetchAsServable();
-
   // Called on `this` receives servable response.
   void OnServableResponseCodeReceived();
 
@@ -445,10 +438,6 @@
   // this callback.
   base::OnceCallback<void(bool)> report_error_callback_;
 
-  // Track if the request has already been marked as servable, and if so, don't
-  // report it again.
-  bool marked_as_servable_ = false;
-
   scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 
   net::NetworkTrafficAnnotationTag network_traffic_annotation_;
@@ -456,10 +445,6 @@
   // Whether this loader is created specifically for a navigation prefetch.
   bool navigation_prefetch_;
 
-  // The prefetch URL, used to record whether the prefetch and navigation URLs
-  // match when this is a navigation prefetch.
-  GURL prefetch_url_;
-
   // Whether this url loader was activated via the navigation stack.
   bool is_activated_ = false;
 
diff --git a/chrome/browser/resources/settings/ai_page/ai_page.ts b/chrome/browser/resources/settings/ai_page/ai_page.ts
index e239df8..56c831d 100644
--- a/chrome/browser/resources/settings/ai_page/ai_page.ts
+++ b/chrome/browser/resources/settings/ai_page/ai_page.ts
@@ -161,7 +161,8 @@
   }
 
   private async setShowAutofillAiControl_() {
-    if (loadTimeData.getBoolean('showAiSettingsForTesting')) {
+    if (loadTimeData.valueExists('showAiSettingsForTesting') &&
+        loadTimeData.getBoolean('showAiSettingsForTesting')) {
       this.showAutofillAIControl_ = true;
       return;
     }
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFragment.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFragment.java
index 6dd773a..49b8e2c 100644
--- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFragment.java
+++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFragment.java
@@ -106,11 +106,13 @@
 
     @Override
     public void onCreatePreferences(Bundle bundle, String s) {
-        mCallbackController = new CallbackController();
-        PostTask.postDelayedTask(
-                TaskTraits.UI_DEFAULT,
-                mCallbackController.makeCancelable(this::triggerOrganicHatsSurvey),
-                ORGANIC_HATS_SURVEY_DELAY_MS);
+        if (ChromeFeatureList.sSafetyHubAndroidOrganicSurvey.isEnabled()) {
+            mCallbackController = new CallbackController();
+            PostTask.postDelayedTask(
+                    TaskTraits.UI_DEFAULT,
+                    mCallbackController.makeCancelable(this::triggerOrganicHatsSurvey),
+                    ORGANIC_HATS_SURVEY_DELAY_MS);
+        }
 
         SettingsUtils.addPreferencesFromResource(this, R.xml.safety_hub_preferences);
         mPageTitle.set(getString(R.string.prefs_safety_check));
diff --git a/chrome/browser/signin/signin_promo_util.cc b/chrome/browser/signin/signin_promo_util.cc
index 8c9371e7..cfc774d 100644
--- a/chrome/browser/signin/signin_promo_util.cc
+++ b/chrome/browser/signin/signin_promo_util.cc
@@ -161,7 +161,7 @@
   switch (type) {
     case AutofillSignInPromoType::kAddress:
       show_count =
-          account.IsEmpty()
+          account.gaia.empty()
               ? profile.GetPrefs()->GetInteger(
                     prefs::kAddressSignInPromoShownCountPerProfile)
               : SigninPrefs(*profile.GetPrefs())
@@ -169,7 +169,7 @@
       break;
     case AutofillSignInPromoType::kPassword:
       show_count =
-          account.IsEmpty()
+          account.gaia.empty()
               ? profile.GetPrefs()->GetInteger(
                     prefs::kPasswordSignInPromoShownCountPerProfile)
               : SigninPrefs(*profile.GetPrefs())
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index 10fee9c..ded2548 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -63,7 +63,6 @@
 #include "chrome/common/url_constants.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/autofill_type.h"
 #include "components/autofill/core/browser/browser_autofill_manager.h"
 #include "components/autofill/core/browser/data_manager/payments/payments_data_manager.h"
@@ -72,6 +71,7 @@
 #include "components/autofill/core/browser/filling_product.h"
 #include "components/autofill/core/browser/form_import/form_data_importer.h"
 #include "components/autofill/core/browser/integrators/autofill_optimization_guide.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/logging/log_router.h"
 #include "components/autofill/core/browser/payments/payments_network_interface.h"
 #include "components/autofill/core/browser/single_field_fillers/single_field_fill_router.h"
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h
index 49c65395..11b93af6 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.h
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -23,11 +23,11 @@
 #include "components/autofill/content/browser/autofill_log_router_factory.h"
 #include "components/autofill/content/browser/content_autofill_client.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/country_type.h"
 #include "components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h"
 #include "components/autofill/core/browser/crowdsourcing/votes_uploader.h"
 #include "components/autofill/core/browser/filling_product.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/browser/metrics/form_interactions_ukm_logger.h"
 #include "components/autofill/core/browser/password_form_classification.h"
diff --git a/chrome/browser/ui/views/frame/browser_view_layout.cc b/chrome/browser/ui/views/frame/browser_view_layout.cc
index f3b7f59f..38064da 100644
--- a/chrome/browser/ui/views/frame/browser_view_layout.cc
+++ b/chrome/browser/ui/views/frame/browser_view_layout.cc
@@ -777,12 +777,10 @@
   // minimum.
   gfx::Rect side_panel_bounds = contents_container_bounds;
 
-  // Cap the side panel width at 2/3rds of the contents container width as long
-  // as the side panel remains at or above its minimum width.
   side_panel_bounds.set_width(
-      std::max(std::min(side_panel->GetPreferredSize().width(),
-                        contents_container_bounds.width() * 2 / 3),
-               side_panel->GetMinimumSize().width()));
+      std::min(side_panel->GetPreferredSize().width(),
+               contents_container_bounds.width() - GetMinWebContentsWidth() -
+                   side_panel_separator->GetPreferredSize().width()));
 
   double side_panel_visible_width =
       side_panel_bounds.width() *
diff --git a/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc b/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc
index afc37ba..20badf63 100644
--- a/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc
+++ b/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc
@@ -504,9 +504,10 @@
 };
 
 // This is a regression test for crbug.com/1335418
+// Flaky on multiple platforms. See crbug.com/384840280
 IN_PROC_BROWSER_TEST_P(
     PasswordBubbleInteractiveUiTestWithExplicitBrowserSigninParam,
-    SaveUiDismissalReason) {
+    DISABLED_SaveUiDismissalReason) {
   base::HistogramTester histogram_tester;
 
   SetupPendingPassword();
diff --git a/chrome/browser/ui/views/side_panel/side_panel_coordinator_browsertest.cc b/chrome/browser/ui/views/side_panel/side_panel_coordinator_browsertest.cc
index db661e70..b6466f7a 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_coordinator_browsertest.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel_coordinator_browsertest.cc
@@ -322,131 +322,6 @@
 
 IN_PROC_BROWSER_TEST_F(SidePanelCoordinatorTest, ChangeSidePanelWidth) {
   Init();
-  // Set side panel to left-aligned so positive resize increments mean an
-  // increase in side panel width.
-  browser()->GetBrowserView().GetProfile()->GetPrefs()->SetBoolean(
-      prefs::kSidePanelHorizontalAlignment, false);
-  coordinator()->DisableAnimationsForTesting();
-
-  const int min_side_panel_width = browser()
-                                       ->GetBrowserView()
-                                       .unified_side_panel()
-                                       ->GetMinimumSize()
-                                       .width();
-
-  // Set the browser width so that two thirds of the browser would be larger
-  // than the minimum side panel width.
-  gfx::Rect original_browser_bounds(browser()->GetBrowserView().GetBounds());
-  gfx::Rect new_bounds(original_browser_bounds);
-  new_bounds.set_width(min_side_panel_width * 3);
-  // Explicitly restore the browser window on ChromeOS, as it would otherwise
-  // be maximized and the SetBounds call would be a no-op.
-#if BUILDFLAG(IS_CHROMEOS)
-  browser()->GetBrowserView().Restore();
-#endif
-  browser()->GetBrowserView().SetBounds(new_bounds);
-
-  coordinator()->Toggle(SidePanelEntry::Key(SidePanelEntry::Id::kBookmarks),
-                        SidePanelOpenTrigger::kPinnedEntryToolbarButton);
-  int browser_width = browser()->GetBrowserView().GetLocalBounds().width();
-  int two_thirds_browser_width = browser_width * 2 / 3;
-  // Select a starting width less than the min width.
-  const int starting_width = min_side_panel_width - 1;
-  browser()->GetBrowserView().unified_side_panel()->SetPanelWidth(
-      starting_width);
-  views::test::RunScheduledLayout(&browser()->GetBrowserView());
-  // Verify the side panel will is at the min width.
-  EXPECT_EQ(browser()->GetBrowserView().unified_side_panel()->width(),
-            min_side_panel_width);
-
-  // Increment the side panel width so that it is larger than the min width but
-  // less than two thirds of the browser width.
-  int increment = (two_thirds_browser_width - min_side_panel_width) / 2;
-  browser()->GetBrowserView().unified_side_panel()->OnResize(increment, true);
-  views::test::RunScheduledLayout(&browser()->GetBrowserView());
-  // Verify the side panel is at its preferred width.
-  EXPECT_EQ(browser()->GetBrowserView().unified_side_panel()->width(),
-            browser()
-                ->GetBrowserView()
-                .unified_side_panel()
-                ->GetPreferredSize()
-                .width());
-
-  // Increment the side panel width so that it is larger than two thirds of the
-  // browser width.
-  increment = (two_thirds_browser_width + 1) -
-              browser()->GetBrowserView().unified_side_panel()->width();
-  browser()->GetBrowserView().unified_side_panel()->OnResize(increment, true);
-  views::test::RunScheduledLayout(&browser()->GetBrowserView());
-  // Verify the side panel width is capped at two thirds of the browser width.
-  EXPECT_EQ(browser()->GetBrowserView().unified_side_panel()->width(),
-            two_thirds_browser_width);
-}
-
-// TODO(crbug.com/384507412): Flaky on Linux.
-#if BUILDFLAG(IS_LINUX)
-#define MAYBE_ChangeSidePanelWidthNarrowWindow \
-  DISABLED_ChangeSidePanelWidthNarrowWindow
-#else
-#define MAYBE_ChangeSidePanelWidthNarrowWindow ChangeSidePanelWidthNarrowWindow
-#endif
-
-IN_PROC_BROWSER_TEST_F(SidePanelCoordinatorTest,
-                       MAYBE_ChangeSidePanelWidthNarrowWindow) {
-  Init();
-  // Set side panel to left-aligned so positive resize increments mean an
-  // increase in side panel width.
-  browser()->GetBrowserView().GetProfile()->GetPrefs()->SetBoolean(
-      prefs::kSidePanelHorizontalAlignment, false);
-  coordinator()->DisableAnimationsForTesting();
-
-  const int min_side_panel_width = browser()
-                                       ->GetBrowserView()
-                                       .unified_side_panel()
-                                       ->GetMinimumSize()
-                                       .width();
-
-  // Set the browser width so that two thirds of the browser would be larger
-  // than the minimum side panel width.
-  gfx::Rect original_browser_bounds(browser()->GetBrowserView().GetBounds());
-  gfx::Rect new_bounds(original_browser_bounds);
-  new_bounds.set_width((min_side_panel_width - 3) * 3 / 2);
-  // Explicitly restore the browser window on ChromeOS, as it would otherwise
-  // be maximized and the SetBounds call would be a no-op.
-#if BUILDFLAG(IS_CHROMEOS)
-  browser()->GetBrowserView().Restore();
-#endif
-  browser()->GetBrowserView().SetBounds(new_bounds);
-
-  coordinator()->Toggle(SidePanelEntry::Key(SidePanelEntry::Id::kBookmarks),
-                        SidePanelOpenTrigger::kPinnedEntryToolbarButton);
-  int browser_width = browser()->GetBrowserView().GetLocalBounds().width();
-  int two_thirds_browser_width = browser_width * 2 / 3;
-  EXPECT_GT(min_side_panel_width, two_thirds_browser_width);
-
-  // Set the side panel width to be less than the min side panel width.
-  browser()->GetBrowserView().unified_side_panel()->SetPanelWidth(
-      min_side_panel_width - 1);
-  views::test::RunScheduledLayout(&browser()->GetBrowserView());
-  // Verify the side panel width is the minimum width and is greater than two
-  // thirds of the browser width.
-  EXPECT_GT(browser()->GetBrowserView().unified_side_panel()->width(),
-            two_thirds_browser_width);
-  EXPECT_EQ(browser()->GetBrowserView().unified_side_panel()->width(),
-            min_side_panel_width);
-
-  // Set the side panel width to be larger than the min side panel width.
-  browser()->GetBrowserView().unified_side_panel()->SetPanelWidth(
-      min_side_panel_width + 1);
-  views::test::RunScheduledLayout(&browser()->GetBrowserView());
-  // Verify the side panel width is is the minimum width.
-  EXPECT_EQ(browser()->GetBrowserView().unified_side_panel()->width(),
-            min_side_panel_width);
-}
-
-IN_PROC_BROWSER_TEST_F(SidePanelCoordinatorTest,
-                       ChangeSidePanelWidthRightAlign) {
-  Init();
   // Set side panel to right-aligned
   browser()->GetBrowserView().GetProfile()->GetPrefs()->SetBoolean(
       prefs::kSidePanelHorizontalAlignment, true);
@@ -462,17 +337,26 @@
   const int increment = 50;
   browser()->GetBrowserView().unified_side_panel()->OnResize(increment, true);
   views::test::RunScheduledLayout(&browser()->GetBrowserView());
-  // Verify positive increments reduce the side panel width
   EXPECT_EQ(browser()->GetBrowserView().unified_side_panel()->width(),
             starting_width - increment);
+
+  // Set side panel to left-aligned
+  browser()->GetBrowserView().GetProfile()->GetPrefs()->SetBoolean(
+      prefs::kSidePanelHorizontalAlignment, false);
+  browser()->GetBrowserView().unified_side_panel()->SetPanelWidth(
+      starting_width);
+  views::test::RunScheduledLayout(&browser()->GetBrowserView());
+  EXPECT_EQ(browser()->GetBrowserView().unified_side_panel()->width(),
+            starting_width);
+
+  browser()->GetBrowserView().unified_side_panel()->OnResize(increment, true);
+  views::test::RunScheduledLayout(&browser()->GetBrowserView());
+  EXPECT_EQ(browser()->GetBrowserView().unified_side_panel()->width(),
+            starting_width + increment);
 }
 
 IN_PROC_BROWSER_TEST_F(SidePanelCoordinatorTest, ChangeSidePanelWidthMaxMin) {
   Init();
-  // Set side panel to left-aligned so positive resize increments mean an
-  // increase in side panel width.
-  browser()->GetBrowserView().GetProfile()->GetPrefs()->SetBoolean(
-      prefs::kSidePanelHorizontalAlignment, false);
   coordinator()->DisableAnimationsForTesting();
 
   coordinator()->Toggle(SidePanelEntry::Key(SidePanelEntry::Id::kBookmarks),
@@ -490,27 +374,22 @@
   browser()->GetBrowserView().unified_side_panel()->OnResize(large_increment,
                                                              true);
   views::test::RunScheduledLayout(&browser()->GetBrowserView());
-
-  const int browser_width =
-      browser()->GetBrowserView().GetLocalBounds().width();
-  const int two_thirds_browser_width = browser_width * 2 / 3;
   EXPECT_EQ(browser()->GetBrowserView().unified_side_panel()->width(),
-            std::max(browser()
-                         ->GetBrowserView()
-                         .unified_side_panel()
-                         ->GetMinimumSize()
-                         .width(),
-                     two_thirds_browser_width));
+            browser()
+                ->GetBrowserView()
+                .unified_side_panel()
+                ->GetMinimumSize()
+                .width());
 
+  browser()->GetBrowserView().unified_side_panel()->OnResize(-large_increment,
+                                                             true);
+  views::test::RunScheduledLayout(&browser()->GetBrowserView());
   BrowserViewLayout* layout_manager = static_cast<BrowserViewLayout*>(
       browser()->GetBrowserView().GetLayoutManager());
-  // the web contents width will either be it's min width or 1/3 the browser
-  // width minus the side panel separator width.
-  const int web_contents_width =
-      std::max(layout_manager->GetMinWebContentsWidthForTesting(),
-               (browser_width - two_thirds_browser_width - 1));
+  const int min_web_contents_width =
+      layout_manager->GetMinWebContentsWidthForTesting();
   EXPECT_EQ(browser()->GetBrowserView().contents_web_view()->width(),
-            web_contents_width);
+            min_web_contents_width);
 }
 
 IN_PROC_BROWSER_TEST_F(SidePanelCoordinatorTest, ChangeSidePanelWidthRTL) {
diff --git a/chrome/browser/ui/webui/BUILD.gn b/chrome/browser/ui/webui/BUILD.gn
index 281c5e7..413bcda 100644
--- a/chrome/browser/ui/webui/BUILD.gn
+++ b/chrome/browser/ui/webui/BUILD.gn
@@ -88,23 +88,9 @@
 }
 
 source_set("webui_util") {
-  sources = [
-    "webui_util.cc",
-    "webui_util.h",
-  ]
+  sources = [ "webui_util.h" ]
 
-  public_deps = [
-    "//base",
-    "//ui/base",
-  ]
-
-  deps = [
-    "//build:chromeos_buildflags",
-    "//content/public/browser",
-    "//content/public/common",
-    "//services/network/public/mojom",
-    "//ui/resources",
-  ]
+  public_deps = [ "//ui/webui" ]
 
   if (!is_android) {
     sources += [
@@ -112,7 +98,7 @@
       "webui_embedding_context.h",
     ]
 
-    deps += [
+    deps = [
       "//chrome/browser/ui/browser_window:browser_window",
       "//chrome/browser/ui/tabs:tabs_public",
     ]
diff --git a/chrome/browser/ui/webui/commerce/commerce_internals_ui_config.cc b/chrome/browser/ui/webui/commerce/commerce_internals_ui_config.cc
index ab0f98d..631d817 100644
--- a/chrome/browser/ui/webui/commerce/commerce_internals_ui_config.cc
+++ b/chrome/browser/ui/webui/commerce/commerce_internals_ui_config.cc
@@ -6,23 +6,11 @@
 
 #include "chrome/browser/commerce/shopping_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/webui_util.h"
 #include "components/commerce/content/browser/commerce_internals_ui.h"
 #include "components/commerce/core/commerce_constants.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_ui_data_source.h"
 
 namespace commerce {
 
-void SetUpWebUIDataSource(content::WebUI* web_ui,
-                          const char* web_ui_host,
-                          base::span<const webui::ResourcePath> resources,
-                          int default_resource) {
-  content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
-      web_ui->GetWebContents()->GetBrowserContext(), web_ui_host);
-  webui::SetupWebUIDataSource(source, resources, default_resource);
-}
-
 CommerceInternalsUIConfig::CommerceInternalsUIConfig()
     : WebUIConfig(content::kChromeUIScheme,
                   commerce::kChromeUICommerceInternalsHost) {}
@@ -35,8 +23,6 @@
   Profile* profile = Profile::FromWebUI(web_ui);
   return std::make_unique<CommerceInternalsUI>(
       web_ui,
-      base::BindOnce(&SetUpWebUIDataSource, web_ui,
-                     commerce::kChromeUICommerceInternalsHost),
       commerce::ShoppingServiceFactory::GetForBrowserContext(profile));
 }
 
diff --git a/chrome/browser/ui/webui/history_clusters/history_clusters_internals_ui_config.cc b/chrome/browser/ui/webui/history_clusters/history_clusters_internals_ui_config.cc
index b84700ed..193fdf97 100644
--- a/chrome/browser/ui/webui/history_clusters/history_clusters_internals_ui_config.cc
+++ b/chrome/browser/ui/webui/history_clusters/history_clusters_internals_ui_config.cc
@@ -7,26 +7,11 @@
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/history_clusters/history_clusters_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/webui_util.h"
 #include "components/history_clusters/history_clusters_internals/webui/history_clusters_internals_ui.h"
 #include "components/history_clusters/history_clusters_internals/webui/url_constants.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_ui_data_source.h"
 
 namespace history_clusters_internals {
 
-// TODO(crbug.com/40222519): Move SetupWebUIDataSource() to a location
-// accessible from components/, such as in //ui/base/webui, so that the only
-// 'wrapping' in this Config class is HistoryClustersServiceFactory.
-void SetUpWebUIDataSource(content::WebUI* web_ui,
-                          const char* web_ui_host,
-                          base::span<const webui::ResourcePath> resources,
-                          int default_resource) {
-  content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
-      web_ui->GetWebContents()->GetBrowserContext(), web_ui_host);
-  webui::SetupWebUIDataSource(source, resources, default_resource);
-}
-
 HistoryClustersInternalsUIConfig::HistoryClustersInternalsUIConfig()
     : WebUIConfig(
           content::kChromeUIScheme,
@@ -41,10 +26,7 @@
   return std::make_unique<HistoryClustersInternalsUI>(
       web_ui, HistoryClustersServiceFactory::GetForBrowserContext(profile),
       HistoryServiceFactory::GetForProfile(profile,
-                                           ServiceAccessType::EXPLICIT_ACCESS),
-      base::BindOnce(
-          &SetUpWebUIDataSource, web_ui,
-          history_clusters_internals::kChromeUIHistoryClustersInternalsHost));
+                                           ServiceAccessType::EXPLICIT_ACCESS));
 }
 
 }  // namespace history_clusters_internals
diff --git a/chrome/browser/ui/webui/webui_util.h b/chrome/browser/ui/webui/webui_util.h
index 096c92e..adad1e8f 100644
--- a/chrome/browser/ui/webui/webui_util.h
+++ b/chrome/browser/ui/webui/webui_util.h
@@ -8,47 +8,12 @@
 #include "base/containers/span.h"
 #include "build/build_config.h"
 #include "ui/base/webui/resource_path.h"
+#include "ui/webui/webui_util.h"
 
-namespace content {
-class WebUIDataSource;
-}
-
-namespace webui {
-
-inline constexpr char kDefaultTrustedTypesPolicies[] =
-    "trusted-types parse-html-subset sanitize-inner-html static-types "
-    // Add TrustedTypes policies used during tests.
-    "webui-test-script webui-test-html "
-    // Add TrustedTypes policy for creating the PDF plugin.
-    "print-preview-plugin-loader "
-    // Add TrustedTypes policies necessary for using Polymer.
-    "polymer-html-literal polymer-template-event-attribute-policy "
-    // Add TrustedTypes policies necessary for using Desktop's Lit bundle.
-    "lit-html-desktop";
-
-// Performs common setup steps for a |source| using JS modules: enable i18n
-// string replacements, adding test resources, and configuring script-src CSP
-// headers to allow tests to work.
-// UIs that don't have a dedicated grd file should generally use this utility.
-void SetJSModuleDefaults(content::WebUIDataSource* source);
-
-// Calls SetJSModuleDefaults(), and additionally adds all resources in the
-// resource map to |source| and sets |default_resource| as the default resource.
-// UIs that have a dedicated grd file should generally use this utility.
-void SetupWebUIDataSource(content::WebUIDataSource* source,
-                          base::span<const ResourcePath> resources,
-                          int default_resource);
-
-// Enables the 'trusted-types' CSP for the given WebUIDataSource. This is the
-// default behavior when calling SetupWebUIDataSource().
-void EnableTrustedTypesCSP(content::WebUIDataSource* source);
-
-// Adds string for |id| to |source| and removes & from the string to allow for
-// reuse of generic strings.
-void AddLocalizedString(content::WebUIDataSource* source,
-                        const std::string& message,
-                        int id);
-
-}  // namespace webui
+using webui::AddLocalizedString;
+using webui::EnableTrustedTypesCSP;
+using webui::kDefaultTrustedTypesPolicies;
+using webui::SetJSModuleDefaults;
+using webui::SetupWebUIDataSource;
 
 #endif  // CHROME_BROWSER_UI_WEBUI_WEBUI_UTIL_H_
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index 4877441..ccc28e6 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1734479922-ff1d053679cb872583c828d372638e001622dd84-e0ce22fbeaee939ba05ec621718e06978cc83609.profdata
+chrome-android32-main-1734501558-73d5ba79bab710e39d8a9060cf945669c59983eb-cc322245613cbd94e3454e147152b6297a381067.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 814f71f2..b71aa92 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1734478304-14f8b971d10c7e51c3bcb151911fa781830844c3-35cdd1d4d337d0d80123a5ebf3adc62f42c02481.profdata
+chrome-android64-main-1734510021-b909afebb114267c3f8eb1e67da279d04b5dc1bc-d5e12a6e4c74b473a6d9872ce7aadae8ca34cebd.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 3b3c640..70beee1 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1734479922-08aaacf16f95bf3659bc506582858d4a1a085b9e-e0ce22fbeaee939ba05ec621718e06978cc83609.profdata
+chrome-linux-main-1734501558-27fa9c19c66dc2026bd5e4b4b4ba534d7b331da6-cc322245613cbd94e3454e147152b6297a381067.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 68fa017..82b65b0 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1734479922-8c3d07e637d1cd9c1a3b02d21a827a91366a4dff-e0ce22fbeaee939ba05ec621718e06978cc83609.profdata
+chrome-mac-arm-main-1734501558-2c9ad7afcc10fdaa880134629f39df2d21302745-cc322245613cbd94e3454e147152b6297a381067.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index cbfc5f3..5ee7edd 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1734458182-7df1a378564e0a02a509d893cd6f564a026ccc8d-c29f06c4a45d01eca24119097916df5f13b682ef.profdata
+chrome-mac-main-1734501558-34fae55566ef33c2d3010a92862e077bf6dea47b-cc322245613cbd94e3454e147152b6297a381067.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index b95c353..363cac7 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1734479922-62bbfa46000e9bc56aef38e369add3e562d97702-e0ce22fbeaee939ba05ec621718e06978cc83609.profdata
+chrome-win-arm64-main-1734501558-2c7a498322550fb82d9d171d294359f2c51517bd-cc322245613cbd94e3454e147152b6297a381067.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 23b5bd1..f88231f 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1734458182-8052260335689c799b0e1a2e837d3fa033acc41a-c29f06c4a45d01eca24119097916df5f13b682ef.profdata
+chrome-win32-main-1734490732-f060148736a22632d444634b9953ab325c4a71ea-942551e575912a0fc12ee9b50428ef9063c43097.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index d9a495e..b0ab7090 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1734447042-b17281d1bce791bd0bcb4379e4a7c669ee9ed38d-aec661770742e09205cfcdcbf03dbd1ac8cf777b.profdata
+chrome-win64-main-1734479922-cd798ca1fdc054b526124c62e56856374308ef15-e0ce22fbeaee939ba05ec621718e06978cc83609.profdata
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index 272956a..f67d327 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -8685,8 +8685,7 @@
             'enable-experimental-web-platform-features']
     self._driver = self.CreateDriver(
         accept_insecure_certs=True,
-        chrome_switches=self.chrome_switches +
-            ["--enable-features=FedCmIdpSigninStatusEnabled"])
+        chrome_switches=self.chrome_switches)
 
     self._driver.Load(self._url_prefix + "/mark-signed-in")
 
diff --git a/chrome/test/data/webui/chromeos/diagnostics/input_card_test.ts b/chrome/test/data/webui/chromeos/diagnostics/input_card_test.ts
index 2e46f59..3427ce4 100644
--- a/chrome/test/data/webui/chromeos/diagnostics/input_card_test.ts
+++ b/chrome/test/data/webui/chromeos/diagnostics/input_card_test.ts
@@ -8,7 +8,7 @@
 import type {IronIconElement} from '//resources/polymer/v3_0/iron-icon/iron-icon.js';
 import {fakeTouchDevices} from 'chrome://diagnostics/fake_data.js';
 import {FakeInputDataProvider} from 'chrome://diagnostics/fake_input_data_provider.js';
-import {ConnectionType, KeyboardInfo, MechanicalLayout, NumberPadPresence, PhysicalLayout, TopRightKey, TopRowKey} from 'chrome://diagnostics/input.mojom-webui.js';
+import {BottomLeftLayout, BottomRightLayout, ConnectionType, KeyboardInfo, MechanicalLayout, NumberPadPresence, NumpadLayout, PhysicalLayout, TopRightKey, TopRowKey} from 'chrome://diagnostics/input.mojom-webui.js';
 import {InputCardElement, InputCardType} from 'chrome://diagnostics/input_card.js';
 import {TouchDeviceInfo} from 'chrome://diagnostics/input_data_provider.mojom-webui.js';
 import {setInputDataProviderForTesting} from 'chrome://diagnostics/mojo_interface_provider.js';
@@ -43,6 +43,9 @@
     ],
     topRightKey: TopRightKey.kLock,
     regionCode: 'US',
+    bottomLeftLayout: BottomLeftLayout.kUnknown,
+    bottomRightLayout: BottomRightLayout.kUnknown,
+    numpadLayout: NumpadLayout.kUnknown,
   },
   {
     id: 10,
@@ -55,6 +58,10 @@
     topRowKeys: [],
     topRightKey: TopRightKey.kUnknown,
     regionCode: 'US',
+    bottomLeftLayout: BottomLeftLayout.kUnknown,
+    bottomRightLayout: BottomRightLayout.kUnknown,
+    numpadLayout: NumpadLayout.kUnknown,
+
   },
 ];
 
diff --git a/chrome/test/data/webui/chromeos/diagnostics/input_list_test.ts b/chrome/test/data/webui/chromeos/diagnostics/input_list_test.ts
index daf1961..23435a16 100644
--- a/chrome/test/data/webui/chromeos/diagnostics/input_list_test.ts
+++ b/chrome/test/data/webui/chromeos/diagnostics/input_list_test.ts
@@ -10,7 +10,7 @@
 import {NavigationView} from 'chrome://diagnostics/diagnostics_types.js';
 import {fakeKeyboards, fakeTouchDevices} from 'chrome://diagnostics/fake_data.js';
 import {FakeInputDataProvider} from 'chrome://diagnostics/fake_input_data_provider.js';
-import {ConnectionType, KeyboardInfo, MechanicalLayout, NumberPadPresence, PhysicalLayout, TopRightKey, TopRowKey} from 'chrome://diagnostics/input.mojom-webui.js';
+import {BottomLeftLayout, BottomRightLayout, ConnectionType, KeyboardInfo, MechanicalLayout, NumberPadPresence, NumpadLayout, PhysicalLayout, TopRightKey, TopRowKey} from 'chrome://diagnostics/input.mojom-webui.js';
 import {InputCardElement} from 'chrome://diagnostics/input_card.js';
 import {TouchDeviceInfo, TouchDeviceType} from 'chrome://diagnostics/input_data_provider.mojom-webui.js';
 import {InputListElement} from 'chrome://diagnostics/input_list.js';
@@ -158,6 +158,9 @@
         TopRowKey.kVolumeUp,
       ],
       topRightKey: TopRightKey.kUnknown,
+      bottomLeftLayout: BottomLeftLayout.kUnknown,
+      bottomRightLayout: BottomRightLayout.kUnknown,
+      numpadLayout: NumpadLayout.kUnknown,
     };
     await initializeInputList();
     const keyboardCard = getCardByDeviceType('keyboard');
diff --git a/chrome/test/data/webui/chromeos/diagnostics/keyboard_tester_test.ts b/chrome/test/data/webui/chromeos/diagnostics/keyboard_tester_test.ts
index b3327961..ea57ee6 100644
--- a/chrome/test/data/webui/chromeos/diagnostics/keyboard_tester_test.ts
+++ b/chrome/test/data/webui/chromeos/diagnostics/keyboard_tester_test.ts
@@ -6,7 +6,7 @@
 import 'chrome://diagnostics/strings.m.js';
 import 'chrome://webui-test/chromeos/mojo_webui_test_support.js';
 
-import {ConnectionType, MechanicalLayout, NumberPadPresence, PhysicalLayout, TopRightKey} from 'chrome://diagnostics/input.mojom-webui.js';
+import {BottomLeftLayout, BottomRightLayout, ConnectionType, MechanicalLayout, NumberPadPresence, NumpadLayout, PhysicalLayout, TopRightKey} from 'chrome://diagnostics/input.mojom-webui.js';
 import {KeyEventType} from 'chrome://diagnostics/input_data_provider.mojom-webui.js';
 import {KeyboardTesterElement} from 'chrome://diagnostics/keyboard_tester.js';
 import {KeyboardDiagramElement, TopRightKey as DiagramTopRightKey} from 'chrome://resources/ash/common/keyboard_diagram.js';
@@ -33,6 +33,9 @@
     topRowKeys: [],
     topRightKey: TopRightKey.kPower,
     regionCode: 'jp',
+    bottomLeftLayout: BottomLeftLayout.kUnknown,
+    bottomRightLayout: BottomRightLayout.kUnknown,
+    numpadLayout: NumpadLayout.kUnknown,
   };
 
   setup(() => {
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 6c96453..c2df6367 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-16131.0.0-1065459
\ No newline at end of file
+16131.0.0-1065471
\ No newline at end of file
diff --git a/chromeos/ash/components/mantis/media_app/BUILD.gn b/chromeos/ash/components/mantis/media_app/BUILD.gn
index 0cdca302..3e7bf30 100644
--- a/chromeos/ash/components/mantis/media_app/BUILD.gn
+++ b/chromeos/ash/components/mantis/media_app/BUILD.gn
@@ -20,6 +20,7 @@
     "//base",
     "//chromeos/ash/components/mantis/mojom",
     "//chromeos/ash/components/mojo_service_manager",
+    "//components/prefs",
     "//mojo/public/cpp/bindings",
   ]
 }
diff --git a/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager.cc b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager.cc
index dbf60dc..e3a2a3f1 100644
--- a/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager.cc
+++ b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "ash/constants/ash_pref_names.h"
 #include "ash/constants/ash_switches.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_forward.h"
@@ -25,6 +26,12 @@
 using ::ash::media_app_ui::mojom::MantisUntrustedPage;
 using ::mantis::mojom::PlatformModelProgressObserver;
 
+enum class GenAIPhotoEditingSettings {
+  kAllowed = 0,                // Allow and improve AI models
+  kAllowedWithoutLogging = 1,  // Allow without improving AI models
+  kDisabled = 2,               // Do not allow
+};
+
 // A helper class that wraps `MantisUntrustedPage::ReportMantisProgress()` as
 // `PlatformModelProgressObserver::Progress()`.
 class InitializeProgressObserver : public PlatformModelProgressObserver {
@@ -70,14 +77,19 @@
 }
 
 void MantisUntrustedServiceManager::IsAvailable(
+    PrefService* pref_service,
     base::OnceCallback<void(bool)> callback) {
   if (switches::IsMantisSecretKeyMatched()) {
     std::move(callback).Run(true);
     return;
   }
 
-  // TODO(crbug.com/362993438): Check admin console policy, age restriction, and
-  // region restriction.
+  // TODO(crbug.com/362993438): Check age restriction and region restriction.
+  if (pref_service->GetInteger(ash::prefs::kGenAIPhotoEditingSettings) ==
+      static_cast<int>(GenAIPhotoEditingSettings::kDisabled)) {
+    std::move(callback).Run(false);
+    return;
+  }
 
   // Query kCrosMantisService first since it might not be available on every
   // devices.
diff --git a/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager.h b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager.h
index 27dd745f..062c729 100644
--- a/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager.h
+++ b/chromeos/ash/components/mantis/media_app/mantis_untrusted_service_manager.h
@@ -13,6 +13,7 @@
 #include "chromeos/ash/components/mantis/media_app/mantis_untrusted_service.h"
 #include "chromeos/ash/components/mantis/mojom/mantis_service.mojom.h"
 #include "chromeos/ash/components/mojo_service_manager/mojom/mojo_service_manager.mojom.h"
+#include "components/prefs/pref_service.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/unique_receiver_set.h"
@@ -34,7 +35,8 @@
       const MantisUntrustedServiceManager&) = delete;
   ~MantisUntrustedServiceManager();
 
-  void IsAvailable(base::OnceCallback<void(bool)> callback);
+  void IsAvailable(PrefService* pref_service,
+                   base::OnceCallback<void(bool)> callback);
   void Create(
       mojo::PendingRemote<media_app_ui::mojom::MantisUntrustedPage> page,
       CreateCallback callback);
diff --git a/chromeos/ash/components/standalone_browser/standalone_browser_features.cc b/chromeos/ash/components/standalone_browser/standalone_browser_features.cc
index 7c0689d..bdcd4b50 100644
--- a/chromeos/ash/components/standalone_browser/standalone_browser_features.cc
+++ b/chromeos/ash/components/standalone_browser/standalone_browser_features.cc
@@ -19,12 +19,6 @@
              "LacrosForSupervisedUsers",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Enables to use lacros-chrome as the only web browser on ChromeOS.
-// This may not be allowed depending on user types and/or policies.
-// NOTE: Use crosapi::browser_util::IsLacrosEnabled() instead of checking
-// the feature directly.
-BASE_FEATURE(kLacrosOnly, "LacrosOnly", base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Emergency switch to turn off profile migration.
 BASE_FEATURE(kLacrosProfileMigrationForceOff,
              "LacrosProfileMigrationForceOff",
diff --git a/chromeos/ash/components/standalone_browser/standalone_browser_features.h b/chromeos/ash/components/standalone_browser/standalone_browser_features.h
index 9b0e5fd9..beb4d95 100644
--- a/chromeos/ash/components/standalone_browser/standalone_browser_features.h
+++ b/chromeos/ash/components/standalone_browser/standalone_browser_features.h
@@ -17,9 +17,6 @@
 BASE_DECLARE_FEATURE(kLacrosForSupervisedUsers);
 
 COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_STANDALONE_BROWSER)
-BASE_DECLARE_FEATURE(kLacrosOnly);
-
-COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_STANDALONE_BROWSER)
 BASE_DECLARE_FEATURE(kLacrosProfileMigrationForceOff);
 
 }  // namespace ash::standalone_browser::features
diff --git a/chromeos/ash/components/telemetry_extension/events/telemetry_event_service_converters.cc b/chromeos/ash/components/telemetry_extension/events/telemetry_event_service_converters.cc
index b3131df..ec7fb9f 100644
--- a/chromeos/ash/components/telemetry_extension/events/telemetry_event_service_converters.cc
+++ b/chromeos/ash/components/telemetry_extension/events/telemetry_event_service_converters.cc
@@ -388,6 +388,10 @@
       return crosapi::mojom::TelemetryKeyboardTopRowKey::kScreenMirror;
     case diagnostics::mojom::TopRowKey::kDelete:
       return crosapi::mojom::TelemetryKeyboardTopRowKey::kDelete;
+    case diagnostics::mojom::TopRowKey::kAccessibility:
+      return crosapi::mojom::TelemetryKeyboardTopRowKey::kUnknown;
+    case diagnostics::mojom::TopRowKey::kDictation:
+      return crosapi::mojom::TelemetryKeyboardTopRowKey::kUnknown;
   }
   NOTREACHED();
 }
diff --git a/chromeos/ash/components/telemetry_extension/events/telemetry_event_service_converters_unittest.cc b/chromeos/ash/components/telemetry_extension/events/telemetry_event_service_converters_unittest.cc
index dc31933..607fca2 100644
--- a/chromeos/ash/components/telemetry_extension/events/telemetry_event_service_converters_unittest.cc
+++ b/chromeos/ash/components/telemetry_extension/events/telemetry_event_service_converters_unittest.cc
@@ -182,6 +182,12 @@
 
   EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kDelete),
             crosapi::mojom::TelemetryKeyboardTopRowKey::kDelete);
+
+  EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kAccessibility),
+            crosapi::mojom::TelemetryKeyboardTopRowKey::kUnknown);
+
+  EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kDictation),
+            crosapi::mojom::TelemetryKeyboardTopRowKey::kUnknown);
 }
 
 TEST(TelemetryEventServiceConvertersTest, ConvertKeyboardTopRightKey) {
diff --git a/chromeos/ash/services/ime/ime_service.cc b/chromeos/ash/services/ime/ime_service.cc
index a602beb..bb15014 100644
--- a/chromeos/ash/services/ime/ime_service.cc
+++ b/chromeos/ash/services/ime/ime_service.cc
@@ -162,7 +162,6 @@
       &features::kAssistMultiWord,
       &features::kAutocorrectParamsTuning,
       &features::kFirstPartyVietnameseInput,
-      &ash::standalone_browser::features::kLacrosOnly,
       &features::kSystemJapanesePhysicalTyping,
       &features::kImeDownloaderExperiment,
       &features::kImeDownloaderUpdate,
@@ -183,15 +182,6 @@
     }
   }
 
-  // For backwards-compatibility, check for the "LacrosSupport" flag, which was
-  // replaced by LacrosOnly.
-  // TODO(b/290714161): Remove this once the shared library no longer uses
-  // LacrosSupport.
-  if (strcmp(feature_name, "LacrosSupport") == 0) {
-    return base::FeatureList::IsEnabled(
-        ash::standalone_browser::features::kLacrosOnly);
-  }
-
   return false;
 }
 
diff --git a/clank b/clank
index 39154b6..644765e 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 39154b6f5dc2836f6dac6e46c711d1c737beb3fd
+Subproject commit 644765e55ff47d34b1ceb3191960588015a586f2
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 4d08883..bc2d7ef 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -243,6 +243,7 @@
     "//components/language/core/common:unit_tests",
     "//components/language/core/language_model:unit_tests",
     "//components/language_detection/core:unit_tests",
+    "//components/language_detection/core/browser:unit_tests",
     "//components/lens:unit_tests",
     "//components/leveldb_proto:unit_tests",
     "//components/local_state:unit_tests",
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 78805f1..a83ec968 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -85,7 +85,6 @@
     "autofill_field.h",
     "autofill_manager.cc",
     "autofill_manager.h",
-    "autofill_plus_address_delegate.h",
     "autofill_shared_storage_handler.h",
     "autofill_trigger_source.h",
     "autofill_type.cc",
@@ -310,6 +309,7 @@
     "integrators/autofill_compose_delegate.h",
     "integrators/autofill_optimization_guide.cc",
     "integrators/autofill_optimization_guide.h",
+    "integrators/autofill_plus_address_delegate.h",
     "integrators/fast_checkout_client.h",
     "integrators/fast_checkout_delegate.h",
     "integrators/fast_checkout_enums.h",
@@ -926,6 +926,8 @@
     "integrators/mock_autofill_compose_delegate.h",
     "integrators/mock_autofill_optimization_guide.cc",
     "integrators/mock_autofill_optimization_guide.h",
+    "integrators/mock_autofill_plus_address_delegate.cc",
+    "integrators/mock_autofill_plus_address_delegate.h",
     "integrators/mock_fast_checkout_client.cc",
     "integrators/mock_fast_checkout_client.h",
     "logging/stub_log_manager.cc",
@@ -938,8 +940,6 @@
     "mock_autofill_manager.h",
     "mock_autofill_manager_observer.cc",
     "mock_autofill_manager_observer.h",
-    "mock_autofill_plus_address_delegate.cc",
-    "mock_autofill_plus_address_delegate.h",
     "mock_autofill_prediction_improvements_delegate.cc",
     "payments/credit_card_access_manager_test_api.h",
     "payments/credit_card_access_manager_test_base.cc",
diff --git a/components/autofill/core/browser/autofill_client.cc b/components/autofill/core/browser/autofill_client.cc
index 76e1f04..e60bc75 100644
--- a/components/autofill/core/browser/autofill_client.cc
+++ b/components/autofill/core/browser/autofill_client.cc
@@ -7,10 +7,10 @@
 #include "base/memory/raw_ptr.h"
 #include "base/no_destructor.h"
 #include "build/build_config.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/filling_product.h"
 #include "components/autofill/core/browser/integrators/autofill_ai_delegate.h"
 #include "components/autofill/core/browser/integrators/autofill_compose_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/payments/credit_card_access_manager.h"
 #include "components/autofill/core/browser/studies/autofill_ablation_study.h"
 #include "components/autofill/core/browser/ui/popup_open_enums.h"
diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc
index 8738293e..ef8afa7 100644
--- a/components/autofill/core/browser/autofill_external_delegate.cc
+++ b/components/autofill/core/browser/autofill_external_delegate.cc
@@ -29,7 +29,6 @@
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_driver.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/autofill_trigger_source.h"
 #include "components/autofill/core/browser/autofill_type.h"
 #include "components/autofill/core/browser/browser_autofill_manager.h"
@@ -41,6 +40,7 @@
 #include "components/autofill/core/browser/filling_product.h"
 #include "components/autofill/core/browser/integrators/autofill_ai_delegate.h"
 #include "components/autofill/core/browser/integrators/autofill_compose_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/metrics/autofill_in_devtools_metrics.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
 #include "components/autofill/core/browser/metrics/log_event.h"
diff --git a/components/autofill/core/browser/autofill_external_delegate_unittest.cc b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
index bec0b1e5..2e2a414 100644
--- a/components/autofill/core/browser/autofill_external_delegate_unittest.cc
+++ b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
@@ -25,7 +25,6 @@
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_form_test_utils.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/autofill_trigger_source.h"
 #include "components/autofill/core/browser/browser_autofill_manager.h"
@@ -37,13 +36,14 @@
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/integrators/autofill_compose_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/integrators/mock_autofill_ai_delegate.h"
 #include "components/autofill/core/browser/integrators/mock_autofill_compose_delegate.h"
+#include "components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/metrics/autofill_in_devtools_metrics.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
 #include "components/autofill/core/browser/metrics/log_event.h"
 #include "components/autofill/core/browser/metrics/suggestions_list_metrics.h"
-#include "components/autofill/core/browser/mock_autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/payments/mock_iban_access_manager.h"
 #include "components/autofill/core/browser/payments/payments_autofill_client.h"
 #include "components/autofill/core/browser/payments/test_payments_autofill_client.h"
diff --git a/components/autofill/core/browser/browser_autofill_manager.h b/components/autofill/core/browser/browser_autofill_manager.h
index 8d736cd..986d041c 100644
--- a/components/autofill/core/browser/browser_autofill_manager.h
+++ b/components/autofill/core/browser/browser_autofill_manager.h
@@ -26,7 +26,6 @@
 #include "components/autofill/core/browser/autofill_driver.h"
 #include "components/autofill/core/browser/autofill_external_delegate.h"
 #include "components/autofill/core/browser/autofill_manager.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/autofill_trigger_source.h"
 #include "components/autofill/core/browser/crowdsourcing/votes_uploader.h"
 #include "components/autofill/core/browser/data_manager/personal_data_manager.h"
@@ -37,6 +36,7 @@
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/form_types.h"
 #include "components/autofill/core/browser/integrators/autofill_ai_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/integrators/fast_checkout_delegate.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
 #include "components/autofill/core/browser/metrics/form_events/address_form_event_logger.h"
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
index 62d435c..3d8c1ee 100644
--- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -34,7 +34,6 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_form_test_utils.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/browser_autofill_manager_test_api.h"
 #include "components/autofill/core/browser/crowdsourcing/mock_autofill_crowdsourcing_manager.h"
@@ -59,12 +58,13 @@
 #include "components/autofill/core/browser/form_structure_test_api.h"
 #include "components/autofill/core/browser/geo/alternative_state_name_map_test_utils.h"
 #include "components/autofill/core/browser/integrators/autofill_compose_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/integrators/mock_autofill_ai_delegate.h"
 #include "components/autofill/core/browser/integrators/mock_autofill_compose_delegate.h"
 #include "components/autofill/core/browser/integrators/mock_autofill_optimization_guide.h"
+#include "components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/metrics/form_events/form_events.h"
 #include "components/autofill/core/browser/metrics/log_event.h"
-#include "components/autofill/core/browser/mock_autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/password_form_classification.h"
 #include "components/autofill/core/browser/payments/credit_card_cvc_authenticator.h"
 #include "components/autofill/core/browser/payments/payments_autofill_client.h"
diff --git a/components/autofill/core/browser/form_import/form_data_importer.cc b/components/autofill/core/browser/form_import/form_data_importer.cc
index 67c88de..925eefbd 100644
--- a/components/autofill/core/browser/form_import/form_data_importer.cc
+++ b/components/autofill/core/browser/form_import/form_data_importer.cc
@@ -24,7 +24,6 @@
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_field.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/autofill_type.h"
 #include "components/autofill/core/browser/country_type.h"
 #include "components/autofill/core/browser/data_manager/addresses/address_data_manager.h"
@@ -49,6 +48,7 @@
 #include "components/autofill/core/browser/form_types.h"
 #include "components/autofill/core/browser/geo/autofill_country.h"
 #include "components/autofill/core/browser/geo/phone_number_i18n.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/browser/metrics/profile_import_metrics.h"
 #include "components/autofill/core/browser/payments/credit_card_save_manager.h"
diff --git a/components/autofill/core/browser/form_import/form_data_importer_unittest.cc b/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
index db1d477..36b8cb9 100644
--- a/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
+++ b/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
@@ -47,8 +47,8 @@
 #include "components/autofill/core/browser/form_import/form_data_importer_test_api.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/form_structure_test_api.h"
+#include "components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics_utils.h"
-#include "components/autofill/core/browser/mock_autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/payments/payments_autofill_client.h"
 #include "components/autofill/core/browser/payments/test_credit_card_save_manager.h"
 #include "components/autofill/core/browser/payments/test_virtual_card_enrollment_manager.h"
diff --git a/components/autofill/core/browser/autofill_plus_address_delegate.h b/components/autofill/core/browser/integrators/autofill_plus_address_delegate.h
similarity index 96%
rename from components/autofill/core/browser/autofill_plus_address_delegate.h
rename to components/autofill/core/browser/integrators/autofill_plus_address_delegate.h
index 934780c1..9e05488f 100644
--- a/components/autofill/core/browser/autofill_plus_address_delegate.h
+++ b/components/autofill/core/browser/integrators/autofill_plus_address_delegate.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
 
 #include <map>
 #include <string>
@@ -199,4 +199,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
diff --git a/components/autofill/core/browser/mock_autofill_plus_address_delegate.cc b/components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.cc
similarity index 78%
rename from components/autofill/core/browser/mock_autofill_plus_address_delegate.cc
rename to components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.cc
index f4f5b65..08a18b7 100644
--- a/components/autofill/core/browser/mock_autofill_plus_address_delegate.cc
+++ b/components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/mock_autofill_plus_address_delegate.h"
+#include "components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.h"
 
 namespace autofill {
 
diff --git a/components/autofill/core/browser/mock_autofill_plus_address_delegate.h b/components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.h
similarity index 90%
rename from components/autofill/core/browser/mock_autofill_plus_address_delegate.h
rename to components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.h
index 1875625..cf232cf 100644
--- a/components/autofill/core/browser/mock_autofill_plus_address_delegate.h
+++ b/components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_MOCK_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_MOCK_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_MOCK_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_MOCK_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
 
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/password_form_classification.h"
 #include "components/autofill/core/browser/ui/suggestion.h"
 #include "components/autofill/core/common/form_field_data.h"
@@ -94,4 +94,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_MOCK_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_INTEGRATORS_MOCK_AUTOFILL_PLUS_ADDRESS_DELEGATE_H_
diff --git a/components/autofill/core/browser/suggestions/addresses/address_suggestion_generator.cc b/components/autofill/core/browser/suggestions/addresses/address_suggestion_generator.cc
index e4efbd1..ce7db7e5 100644
--- a/components/autofill/core/browser/suggestions/addresses/address_suggestion_generator.cc
+++ b/components/autofill/core/browser/suggestions/addresses/address_suggestion_generator.cc
@@ -630,22 +630,27 @@
   // Field types we are interested in showing suggestions for.
   // TODO(crbug.com/381994105): Add a finch parameter to easily experiment with
   // adding and removing field types.
-  static constexpr FieldTypeSet kTypes = {NAME_FIRST,
-                                          NAME_FULL,
-                                          NAME_LAST,
-                                          COMPANY_NAME,
-                                          ADDRESS_HOME_LINE1,
-                                          ADDRESS_HOME_STREET_ADDRESS,
-                                          ADDRESS_HOME_CITY,
-                                          ADDRESS_HOME_STATE,
-                                          ADDRESS_HOME_COUNTRY,
-                                          ADDRESS_HOME_STREET_NAME,
-                                          EMAIL_ADDRESS,
-                                          PHONE_HOME_WHOLE_NUMBER,
-                                          PHONE_HOME_CITY_AND_NUMBER,
-                                          ADDRESS_HOME_ZIP};
+  static constexpr FieldTypeSet kTypes = {
+      NAME_FIRST,
+      NAME_FULL,
+      NAME_LAST,
+      NAME_LAST_SECOND,
+      COMPANY_NAME,
+      ADDRESS_HOME_LINE1,
+      ADDRESS_HOME_LINE2,
+      ADDRESS_HOME_STREET_ADDRESS,
+      ADDRESS_HOME_CITY,
+      ADDRESS_HOME_STATE,
+      ADDRESS_HOME_COUNTRY,
+      ADDRESS_HOME_STREET_NAME,
+      EMAIL_ADDRESS,
+      PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX,
+      PHONE_HOME_CITY_AND_NUMBER,
+      PHONE_HOME_WHOLE_NUMBER,
+      ADDRESS_HOME_ZIP};
   static constexpr FieldTypeSet kNumberTypes = {
-      PHONE_HOME_CITY_AND_NUMBER, PHONE_HOME_WHOLE_NUMBER, ADDRESS_HOME_ZIP};
+      PHONE_HOME_CITY_AND_NUMBER, PHONE_HOME_WHOLE_NUMBER, ADDRESS_HOME_ZIP,
+      PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX};
 
   std::vector<Suggestion> suggestions;
   std::set<std::u16string> suggestions_text;
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h
index 544a815..0cc1aef8 100644
--- a/components/autofill/core/browser/test_autofill_client.h
+++ b/components/autofill/core/browser/test_autofill_client.h
@@ -22,7 +22,6 @@
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_driver_factory.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/country_type.h"
 #include "components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h"
@@ -30,6 +29,7 @@
 #include "components/autofill/core/browser/crowdsourcing/test_votes_uploader.h"
 #include "components/autofill/core/browser/data_manager/test_personal_data_manager.h"
 #include "components/autofill/core/browser/data_quality/addresses/test_address_normalizer.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/integrators/mock_autofill_ai_delegate.h"
 #include "components/autofill/core/browser/integrators/mock_autofill_optimization_guide.h"
 #include "components/autofill/core/browser/integrators/mock_fast_checkout_client.h"
diff --git a/components/collaboration/internal/BUILD.gn b/components/collaboration/internal/BUILD.gn
index 25253e7d..4c286cc 100644
--- a/components/collaboration/internal/BUILD.gn
+++ b/components/collaboration/internal/BUILD.gn
@@ -169,6 +169,7 @@
     "//base",
     "//base/test:test_support",
     "//components/collaboration/internal/messaging/storage/protocol",
+    "//components/collaboration/public:messaging_public",
     "//components/data_sharing:test_support",
     "//components/data_sharing/public",
     "//components/saved_tab_groups/public",
diff --git a/components/collaboration/internal/messaging/messaging_backend_service_impl.cc b/components/collaboration/internal/messaging/messaging_backend_service_impl.cc
index 2fa2a4e..f0322f3 100644
--- a/components/collaboration/internal/messaging/messaging_backend_service_impl.cc
+++ b/components/collaboration/internal/messaging/messaging_backend_service_impl.cc
@@ -12,6 +12,7 @@
 
 #include "base/check.h"
 #include "base/functional/callback.h"
+#include "base/functional/callback_helpers.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/collaboration/internal/messaging/data_sharing_change_notifier_impl.h"
 #include "components/collaboration/internal/messaging/storage/collaboration_message_util.h"
@@ -437,6 +438,7 @@
 }
 
 void MessagingBackendServiceImpl::OnTabGroupChangeNotifierInitialized() {
+  SetCurrentlySelectedTabOnStartup();
   initialized_ = true;
   for (auto& observer : persistent_message_observers_) {
     observer.OnMessagingBackendServiceInitialized();
@@ -445,6 +447,35 @@
   std::move(data_sharing_flush_callback_).Run();
 }
 
+void MessagingBackendServiceImpl::SetCurrentlySelectedTabOnStartup() {
+  std::pair<std::optional<base::Uuid>, std::optional<base::Uuid>>
+      selected_tab_id_pair =
+          tab_group_sync_service_->GetCurrentlySelectedTabID();
+  std::optional<base::Uuid> tab_group_id = selected_tab_id_pair.first;
+  std::optional<base::Uuid> tab_id = selected_tab_id_pair.second;
+  if (!tab_group_id || !tab_id) {
+    // We are missing tab group ID or tab ID, so we will be unable to find the
+    // tab.
+    return;
+  }
+  std::optional<tab_groups::SavedTabGroup> tab_group =
+      tab_group_sync_service_->GetGroup(*tab_group_id);
+  if (!tab_group) {
+    // This should not happen, but since the API returns an std::optional, we
+    // should still do this check to ensure we do not crash when dereferencing
+    // `tab_group`.
+    return;
+  }
+  tab_groups::SavedTabGroupTab* tab = tab_group->GetTab(*tab_id);
+  if (!tab) {
+    // Just as with the `tab_group`, this is not expected to happen, but in case
+    // there is an invariant we are not currently aware of we return early here.
+    return;
+  }
+
+  last_selected_tab_ = *tab;
+}
+
 void MessagingBackendServiceImpl::OnTabGroupAdded(
     const tab_groups::SavedTabGroup& added_group) {
   std::optional<data_sharing::GroupId> collaboration_group_id =
@@ -473,6 +504,17 @@
       *collaboration_group_id, removed_group,
       collaboration_pb::TAB_GROUP_REMOVED, DirtyType::kNone);
   store_->AddMessage(message);
+
+  if (instant_message_delegate_) {
+    InstantMessage instant_message;
+    instant_message.attribution = CreateMessageAttributionForTabUpdates(
+        message, removed_group, std::nullopt);
+    instant_message.collaboration_event = CollaborationEvent::TAB_GROUP_REMOVED;
+    instant_message.type = InstantNotificationType::UNDEFINED;
+
+    DisplayInstantMessage(base::Uuid::ParseLowercase(message.uuid()),
+                          instant_message, {InstantNotificationLevel::BROWSER});
+  }
 }
 
 void MessagingBackendServiceImpl::OnTabGroupNameUpdated(
@@ -558,6 +600,20 @@
 
   DisplayOrHideTabGroupDirtyDotForTabGroup(*collaboration_group_id,
                                            removed_tab.saved_group_guid());
+
+  if (last_selected_tab_ &&
+      last_selected_tab_->saved_tab_guid() == removed_tab.saved_tab_guid() &&
+      instant_message_delegate_) {
+    InstantMessage instant_message_base;
+    instant_message_base.attribution = CreateMessageAttributionForTabUpdates(
+        message, std::nullopt, removed_tab);
+    instant_message_base.collaboration_event = CollaborationEvent::TAB_REMOVED;
+    instant_message_base.type = InstantNotificationType::CONFLICT_TAB_REMOVED;
+
+    DisplayInstantMessage(base::Uuid::ParseLowercase(message.uuid()),
+                          instant_message_base,
+                          {InstantNotificationLevel::BROWSER});
+  }
 }
 
 void MessagingBackendServiceImpl::OnTabUpdated(
@@ -667,6 +723,26 @@
         *user_display_name);
   }
   store_->AddMessage(message);
+
+  if (instant_message_delegate_) {
+    InstantMessage instant_message;
+    instant_message.attribution.collaboration_id =
+        group_data.group_token.group_id;
+    instant_message.collaboration_event =
+        CollaborationEvent::COLLABORATION_MEMBER_ADDED;
+
+    // Look for the member in the provided data.
+    for (const data_sharing::GroupMember& member : group_data.members) {
+      if (member.gaia_id == member_gaia_id) {
+        instant_message.attribution.affected_user = member;
+        break;
+      }
+    }
+
+    DisplayInstantMessage(
+        base::Uuid::ParseLowercase(message.uuid()), instant_message,
+        {InstantNotificationLevel::SYSTEM, InstantNotificationLevel::BROWSER});
+  }
 }
 
 void MessagingBackendServiceImpl::OnGroupMemberRemoved(
@@ -1034,22 +1110,8 @@
   PersistentMessage persistent_message;
   persistent_message.collaboration_event =
       ToCollaborationEvent(message.event_type());
-  persistent_message.attribution = MessageAttribution();
-  persistent_message.attribution.collaboration_id =
-      data_sharing::GroupId(message.collaboration_id());
-  std::optional<tab_groups::SavedTabGroup> stack_tab_group = tab_group;
-  if (!tab_group && tab) {
-    stack_tab_group =
-        tab_group_sync_service_->GetGroup(tab->saved_group_guid());
-  }
-  persistent_message.attribution.tab_group_metadata =
-      CreateTabGroupMessageMetadataFromMessageOrTabGroup(message, tab_group);
-  persistent_message.attribution.tab_metadata =
-      CreateTabMessageMetadataFromMessageOrTab(
-          message, tab.has_value() ? tab : GetTabFromGroup(message, tab_group));
-  persistent_message.attribution.triggering_user = GetGroupMemberFromGaiaId(
-      data_sharing::GroupId(message.collaboration_id()),
-      GaiaId(message.triggering_user_gaia_id()));
+  persistent_message.attribution =
+      CreateMessageAttributionForTabUpdates(message, tab_group, tab);
   if (type) {
     persistent_message.type = *type;
   }
@@ -1121,4 +1183,53 @@
   }
 }
 
+MessageAttribution
+MessagingBackendServiceImpl::CreateMessageAttributionForTabUpdates(
+    const collaboration_pb::Message& message,
+    const std::optional<tab_groups::SavedTabGroup>& tab_group,
+    const std::optional<tab_groups::SavedTabGroupTab>& tab) {
+  MessageAttribution attribution;
+  attribution.collaboration_id =
+      data_sharing::GroupId(message.collaboration_id());
+  std::optional<tab_groups::SavedTabGroup> stack_tab_group = tab_group;
+  if (!tab_group && tab) {
+    stack_tab_group =
+        tab_group_sync_service_->GetGroup(tab->saved_group_guid());
+  }
+  attribution.tab_group_metadata =
+      CreateTabGroupMessageMetadataFromMessageOrTabGroup(message,
+                                                         stack_tab_group);
+  attribution.tab_metadata = CreateTabMessageMetadataFromMessageOrTab(
+      message,
+      tab.has_value() ? tab : GetTabFromGroup(message, stack_tab_group));
+  attribution.triggering_user = GetGroupMemberFromGaiaId(
+      data_sharing::GroupId(message.collaboration_id()),
+      GaiaId(message.triggering_user_gaia_id()));
+  return attribution;
+}
+
+void MessagingBackendServiceImpl::DisplayInstantMessage(
+    const base::Uuid& db_message_uuid,
+    const InstantMessage& base_message,
+    const std::vector<InstantNotificationLevel>& levels) {
+  CHECK(instant_message_delegate_);
+  for (InstantNotificationLevel level : levels) {
+    InstantMessage instant_message = base_message;
+    instant_message.level = level;
+    instant_message_delegate_->DisplayInstantaneousMessage(
+        instant_message,
+        base::BindOnce(&MessagingBackendServiceImpl::ClearMessageDirtyBit,
+                       weak_ptr_factory_.GetWeakPtr(), db_message_uuid));
+  }
+}
+
+void MessagingBackendServiceImpl::ClearMessageDirtyBit(base::Uuid db_message_id,
+                                                       bool success) {
+  if (!success) {
+    return;
+  }
+
+  store_->ClearDirtyMessage(db_message_id, DirtyType::kMessageOnly);
+}
+
 }  // namespace collaboration::messaging
diff --git a/components/collaboration/internal/messaging/messaging_backend_service_impl.h b/components/collaboration/internal/messaging/messaging_backend_service_impl.h
index 276326e..f17ece39 100644
--- a/components/collaboration/internal/messaging/messaging_backend_service_impl.h
+++ b/components/collaboration/internal/messaging/messaging_backend_service_impl.h
@@ -98,6 +98,10 @@
  private:
   void OnStoreInitialized(bool success);
 
+  // We need to be able to find the currently selected tab on startup so we know
+  // what changed in OnTabSelected.
+  void SetCurrentlySelectedTabOnStartup();
+
   // Uses all available sources to try to retrieve a name that describes the
   // given user.
   std::optional<std::string> GetDisplayNameForUserInGroup(
@@ -183,6 +187,22 @@
       const data_sharing::GroupId& collaboration_group_id,
       base::Uuid shared_tab_group_id);
 
+  // Creates MessageAttribution based on all the provided information.
+  MessageAttribution CreateMessageAttributionForTabUpdates(
+      const collaboration_pb::Message& message,
+      const std::optional<tab_groups::SavedTabGroup>& tab_group,
+      const std::optional<tab_groups::SavedTabGroupTab>& tab);
+
+  // Notifies the InstantMessageDelegate to display the message for all the
+  // provided levels.
+  void DisplayInstantMessage(
+      const base::Uuid& db_message_uuid,
+      const InstantMessage& base_message,
+      const std::vector<InstantNotificationLevel>& levels);
+
+  // Clears the dirty bit for the given DB message ID if `success` is true.
+  void ClearMessageDirtyBit(base::Uuid db_message_id, bool success);
+
   // Provides functionality to go from observing the TabGroupSyncService to
   // a delta based observer API.
   std::unique_ptr<TabGroupChangeNotifier> tab_group_change_notifier_;
diff --git a/components/collaboration/internal/messaging/messaging_backend_service_impl_unittest.cc b/components/collaboration/internal/messaging/messaging_backend_service_impl_unittest.cc
index c701b73..779fd81 100644
--- a/components/collaboration/internal/messaging/messaging_backend_service_impl_unittest.cc
+++ b/components/collaboration/internal/messaging/messaging_backend_service_impl_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/functional/callback_forward.h"
 #include "base/test/gmock_callback_support.h"
+#include "base/test/gmock_move_support.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
 #include "base/uuid.h"
@@ -16,6 +17,7 @@
 #include "components/collaboration/internal/messaging/storage/messaging_backend_store.h"
 #include "components/collaboration/internal/messaging/storage/protocol/message.pb.h"
 #include "components/collaboration/internal/messaging/tab_group_change_notifier.h"
+#include "components/collaboration/public/messaging/message.h"
 #include "components/data_sharing/public/group_data.h"
 #include "components/data_sharing/test_support/mock_data_sharing_service.h"
 #include "components/saved_tab_groups/public/saved_tab_group_tab.h"
@@ -30,6 +32,7 @@
 using base::test::RunOnceClosure;
 
 using testing::_;
+using testing::DoAll;
 using testing::Eq;
 using testing::Return;
 using testing::SaveArg;
@@ -95,6 +98,16 @@
       tab_groups::CollaborationId(collaboration_group_id.value()));
   return tab_group;
 }
+
+class MockInstantMessageDelegate
+    : public MessagingBackendService::InstantMessageDelegate {
+ public:
+  MOCK_METHOD(void,
+              DisplayInstantaneousMessage,
+              (InstantMessage message, SuccessCallback success_callback),
+              (override));
+};
+
 }  // namespace
 
 class MockTabGroupChangeNotifier : public TabGroupChangeNotifier {
@@ -241,6 +254,12 @@
     InitializeService();
   }
 
+  void SetupInstantMessageDelegate() {
+    mock_instant_message_delegate_ =
+        std::make_unique<MockInstantMessageDelegate>();
+    service_->SetInstantMessageDelegate(mock_instant_message_delegate_.get());
+  }
+
  protected:
   base::test::SingleThreadTaskEnvironment task_environment{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
@@ -250,6 +269,7 @@
       mock_data_sharing_service_;
   std::unique_ptr<tab_groups::MockTabGroupSyncService>
       mock_tab_group_sync_service_;
+  std::unique_ptr<MockInstantMessageDelegate> mock_instant_message_delegate_;
   std::unique_ptr<MessagingBackendServiceImpl> service_;
   raw_ptr<MockTabGroupChangeNotifier> unowned_tab_group_change_notifier_;
   raw_ptr<MockDataSharingChangeNotifier> unowned_data_sharing_change_notifier_;
@@ -1060,4 +1080,243 @@
   EXPECT_EQ(PersistentNotificationType::DIRTY_TAB, messages.at(1).type);
 }
 
+TEST_F(MessagingBackendServiceImplTest, TestSelectedTabGetsRemoved) {
+  CreateAndInitializeService();
+  SetupInstantMessageDelegate();
+
+  data_sharing::GroupId collaboration_group_id =
+      data_sharing::GroupId("my group id");
+
+  // Store all stored messages to this field
+  collaboration_pb::Message db_message;
+  EXPECT_CALL(*unowned_messaging_backend_store_, AddMessage(_))
+      .WillRepeatedly(SaveArg<0>(&db_message));
+
+  tab_groups::SavedTabGroup tab_group =
+      CreateSharedTabGroup(collaboration_group_id);
+  std::vector<tab_groups::SavedTabGroup> all_groups = {tab_group};
+  EXPECT_CALL(*mock_tab_group_sync_service_, GetAllGroups())
+      .WillRepeatedly(Return(all_groups));
+  EXPECT_CALL(*mock_tab_group_sync_service_, GetGroup(tab_group.saved_guid()))
+      .WillRepeatedly(Return(tab_group));
+  base::Uuid tab1_sync_id = tab_group.saved_tabs().at(0).saved_tab_guid();
+  tab_groups::SavedTabGroupTab* tab1 = tab_group.GetTab(tab1_sync_id);
+
+  tg_notifier_observer_->OnTabSelected(*tab1);
+
+  // Save the last invocation of calls to the InstantMessageDelegate.
+  InstantMessage message;
+  MessagingBackendService::InstantMessageDelegate::SuccessCallback
+      succes_callback;
+  EXPECT_CALL(*mock_instant_message_delegate_,
+              DisplayInstantaneousMessage(_, _))
+      .WillRepeatedly(
+          DoAll(SaveArg<0>(&message), MoveArg<1>(&succes_callback)));
+
+  // Removing the currently selected tab should inform the delegate.
+  tg_notifier_observer_->OnTabRemoved(*tab1);
+
+  // We should have received a stored message about the removed tab.
+  EXPECT_NE("", db_message.uuid());
+  base::Uuid db_message_id = base::Uuid::ParseLowercase(db_message.uuid());
+
+  EXPECT_EQ(CollaborationEvent::TAB_REMOVED, message.collaboration_event);
+  EXPECT_EQ(InstantNotificationType::CONFLICT_TAB_REMOVED, message.type);
+
+  EXPECT_CALL(*unowned_messaging_backend_store_,
+              ClearDirtyMessage(db_message_id, DirtyType::kMessageOnly))
+      .Times(1);
+  std::move(succes_callback).Run(true);
+}
+
+TEST_F(MessagingBackendServiceImplTest, TestSelectedTabAtStartupGetsRemoved) {
+  CreateService();
+
+  data_sharing::GroupId collaboration_group_id =
+      data_sharing::GroupId("my group id");
+
+  tab_groups::SavedTabGroup tab_group =
+      CreateSharedTabGroup(collaboration_group_id);
+  std::vector<tab_groups::SavedTabGroup> all_groups = {tab_group};
+  EXPECT_CALL(*mock_tab_group_sync_service_, GetAllGroups())
+      .WillRepeatedly(Return(all_groups));
+  EXPECT_CALL(*mock_tab_group_sync_service_, GetGroup(tab_group.saved_guid()))
+      .WillRepeatedly(Return(tab_group));
+  base::Uuid tab1_sync_id = tab_group.saved_tabs().at(0).saved_tab_guid();
+  tab_groups::SavedTabGroupTab* tab1 = tab_group.GetTab(tab1_sync_id);
+
+  // This will make tab1 be selected at startup.
+  EXPECT_CALL(*mock_tab_group_sync_service_, GetCurrentlySelectedTabID())
+      .WillOnce(Return(std::pair(tab_group.saved_guid(), tab1_sync_id)));
+
+  InitializeService();
+  SetupInstantMessageDelegate();
+
+  InstantMessage message;
+  MessagingBackendService::InstantMessageDelegate::SuccessCallback
+      succes_callback;
+  EXPECT_CALL(*mock_instant_message_delegate_,
+              DisplayInstantaneousMessage(_, _))
+      .WillRepeatedly(
+          DoAll(SaveArg<0>(&message), MoveArg<1>(&succes_callback)));
+  tg_notifier_observer_->OnTabRemoved(*tab1);
+
+  EXPECT_EQ(CollaborationEvent::TAB_REMOVED, message.collaboration_event);
+  EXPECT_EQ(InstantNotificationType::CONFLICT_TAB_REMOVED, message.type);
+}
+
+TEST_F(MessagingBackendServiceImplTest, TestUnselectedTabGetsRemoved) {
+  CreateAndInitializeService();
+  SetupInstantMessageDelegate();
+
+  data_sharing::GroupId collaboration_group_id =
+      data_sharing::GroupId("my group id");
+
+  // Store all stored messages to this field
+  collaboration_pb::Message db_message;
+  EXPECT_CALL(*unowned_messaging_backend_store_, AddMessage(_))
+      .WillRepeatedly(SaveArg<0>(&db_message));
+
+  tab_groups::SavedTabGroup tab_group =
+      CreateSharedTabGroup(collaboration_group_id);
+  std::vector<tab_groups::SavedTabGroup> all_groups = {tab_group};
+  EXPECT_CALL(*mock_tab_group_sync_service_, GetAllGroups())
+      .WillRepeatedly(Return(all_groups));
+  EXPECT_CALL(*mock_tab_group_sync_service_, GetGroup(tab_group.saved_guid()))
+      .WillRepeatedly(Return(tab_group));
+  base::Uuid tab1_sync_id = tab_group.saved_tabs().at(0).saved_tab_guid();
+  tab_groups::SavedTabGroupTab* tab1 = tab_group.GetTab(tab1_sync_id);
+
+  tg_notifier_observer_->OnTabSelected(*tab1);
+
+  // Removing tab 2 should not invoke the delegate.
+  base::Uuid tab2_sync_id = tab_group.saved_tabs().at(1).saved_tab_guid();
+  tab_groups::SavedTabGroupTab* tab2 = tab_group.GetTab(tab2_sync_id);
+  EXPECT_CALL(*mock_instant_message_delegate_,
+              DisplayInstantaneousMessage(_, _))
+      .Times(0);
+  tg_notifier_observer_->OnTabRemoved(*tab2);
+}
+
+TEST_F(MessagingBackendServiceImplTest, TestTabGroupRemovedInstantMessage) {
+  CreateAndInitializeService();
+  SetupInstantMessageDelegate();
+
+  data_sharing::GroupId collaboration_group_id =
+      data_sharing::GroupId("my group id");
+
+  // Store all stored messages to this field
+  collaboration_pb::Message db_message;
+  EXPECT_CALL(*unowned_messaging_backend_store_, AddMessage(_))
+      .WillRepeatedly(SaveArg<0>(&db_message));
+
+  tab_groups::SavedTabGroup tab_group =
+      CreateSharedTabGroup(collaboration_group_id);
+  std::vector<tab_groups::SavedTabGroup> all_groups = {tab_group};
+  EXPECT_CALL(*mock_tab_group_sync_service_, GetAllGroups())
+      .WillRepeatedly(Return(all_groups));
+  EXPECT_CALL(*mock_tab_group_sync_service_, GetGroup(tab_group.saved_guid()))
+      .WillRepeatedly(Return(tab_group));
+
+  // Save the last invocation of calls to the InstantMessageDelegate.
+  InstantMessage message;
+  MessagingBackendService::InstantMessageDelegate::SuccessCallback
+      succes_callback;
+  EXPECT_CALL(*mock_instant_message_delegate_,
+              DisplayInstantaneousMessage(_, _))
+      .WillRepeatedly(
+          DoAll(SaveArg<0>(&message), MoveArg<1>(&succes_callback)));
+
+  // Removing the tab group should inform the delegate.
+  tg_notifier_observer_->OnTabGroupRemoved(tab_group);
+
+  // We should have received a stored message about the removed tab group.
+  EXPECT_NE("", db_message.uuid());
+  base::Uuid db_message_id = base::Uuid::ParseLowercase(db_message.uuid());
+
+  EXPECT_EQ(CollaborationEvent::TAB_GROUP_REMOVED, message.collaboration_event);
+  EXPECT_EQ(tab_group.saved_guid(),
+            message.attribution.tab_group_metadata->sync_tab_group_id);
+
+  EXPECT_CALL(*unowned_messaging_backend_store_,
+              ClearDirtyMessage(db_message_id, DirtyType::kMessageOnly))
+      .Times(1);
+  std::move(succes_callback).Run(true);
+}
+
+TEST_F(MessagingBackendServiceImplTest, TestInstantMessageCallbackFails) {
+  CreateAndInitializeService();
+  SetupInstantMessageDelegate();
+
+  data_sharing::GroupId collaboration_group_id =
+      data_sharing::GroupId("my group id");
+
+  // Store all stored messages to this field
+  collaboration_pb::Message db_message;
+  EXPECT_CALL(*unowned_messaging_backend_store_, AddMessage(_))
+      .WillRepeatedly(SaveArg<0>(&db_message));
+
+  tab_groups::SavedTabGroup tab_group =
+      CreateSharedTabGroup(collaboration_group_id);
+  std::vector<tab_groups::SavedTabGroup> all_groups = {tab_group};
+  EXPECT_CALL(*mock_tab_group_sync_service_, GetAllGroups())
+      .WillRepeatedly(Return(all_groups));
+  EXPECT_CALL(*mock_tab_group_sync_service_, GetGroup(tab_group.saved_guid()))
+      .WillRepeatedly(Return(tab_group));
+
+  // Save the last invocation of calls to the InstantMessageDelegate.
+  InstantMessage message;
+  MessagingBackendService::InstantMessageDelegate::SuccessCallback
+      succes_callback;
+  EXPECT_CALL(*mock_instant_message_delegate_,
+              DisplayInstantaneousMessage(_, _))
+      .WillRepeatedly(
+          DoAll(SaveArg<0>(&message), MoveArg<1>(&succes_callback)));
+
+  // Removing the tab group should inform the delegate.
+  tg_notifier_observer_->OnTabGroupRemoved(tab_group);
+
+  // If the callback provides success=false we should not clear the bit.
+  EXPECT_CALL(*unowned_messaging_backend_store_, ClearDirtyMessage(_, _))
+      .Times(0);
+  std::move(succes_callback).Run(false);
+}
+
+TEST_F(MessagingBackendServiceImplTest, TestMemberAddedCreatesInstantMessage) {
+  CreateAndInitializeService();
+  SetupInstantMessageDelegate();
+
+  data_sharing::GroupData group_data;
+  group_data.group_token.group_id = data_sharing::GroupId("my group id");
+  data_sharing::GroupMember member1;
+  member1.gaia_id = GaiaId("abc");
+  member1.display_name = "Provided Diplay Name 1";
+  member1.given_name = "Provided Given Name 1";
+  group_data.members.emplace_back(member1);
+
+  data_sharing::GroupMember member2;
+  member2.gaia_id = GaiaId("def");
+  member2.display_name = "Provided Display Name 2";
+  member2.given_name = "";  // No given name available.
+  group_data.members.emplace_back(member2);
+
+  base::Time now = base::Time::Now();
+
+  collaboration_pb::Message db_message;
+  EXPECT_CALL(*unowned_messaging_backend_store_, AddMessage(_))
+      .WillRepeatedly(SaveArg<0>(&db_message));
+
+  // Save the last invocation of calls to the InstantMessageDelegate.
+  InstantMessage message;
+  EXPECT_CALL(*mock_instant_message_delegate_,
+              DisplayInstantaneousMessage(_, _))
+      .WillRepeatedly(SaveArg<0>(&message));
+
+  ds_notifier_observer_->OnGroupMemberAdded(group_data, member2.gaia_id, now);
+
+  EXPECT_EQ(CollaborationEvent::COLLABORATION_MEMBER_ADDED,
+            message.collaboration_event);
+  EXPECT_EQ(member2.gaia_id, message.attribution.affected_user->gaia_id);
+}
+
 }  // namespace collaboration::messaging
diff --git a/components/commerce/content/browser/commerce_internals_ui.cc b/components/commerce/content/browser/commerce_internals_ui.cc
index 9d085d6..c01c9c8 100644
--- a/components/commerce/content/browser/commerce_internals_ui.cc
+++ b/components/commerce/content/browser/commerce_internals_ui.cc
@@ -9,22 +9,27 @@
 
 #include "components/commerce/content/browser/commerce_internals_ui.h"
 
+#include "components/commerce/core/commerce_constants.h"
 #include "components/commerce/core/shopping_service.h"
 #include "components/grit/commerce_internals_resources.h"
 #include "components/grit/commerce_internals_resources_map.h"
+#include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/webui/webui_util.h"
 
 namespace commerce {
 
 CommerceInternalsUI::CommerceInternalsUI(
     content::WebUI* web_ui,
-    SetupWebUIDataSourceCallback setup_callback,
     ShoppingService* shopping_service)
     : CommerceInternalsUIBase(shopping_service),
       ui::MojoWebUIController(web_ui, true) {
-  std::move(setup_callback)
-      .Run(base::span(kCommerceInternalsResources),
-           IDR_COMMERCE_INTERNALS_COMMERCE_INTERNALS_HTML);
+  content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
+      web_ui->GetWebContents()->GetBrowserContext(),
+      commerce::kChromeUICommerceInternalsHost);
+  webui::SetupWebUIDataSource(source, kCommerceInternalsResources,
+                              IDR_COMMERCE_INTERNALS_COMMERCE_INTERNALS_HTML);
 }
 
 CommerceInternalsUI::~CommerceInternalsUI() = default;
diff --git a/components/commerce/content/browser/commerce_internals_ui.h b/components/commerce/content/browser/commerce_internals_ui.h
index 03b18cc..eef946c 100644
--- a/components/commerce/content/browser/commerce_internals_ui.h
+++ b/components/commerce/content/browser/commerce_internals_ui.h
@@ -29,7 +29,6 @@
                               int default_resource)>;
 
   CommerceInternalsUI(content::WebUI* web_ui,
-                      SetupWebUIDataSourceCallback setup_callback,
                       ShoppingService* shopping_service);
   CommerceInternalsUI(const CommerceInternalsUI&) = delete;
   CommerceInternalsUI operator&(const CommerceInternalsUI&) = delete;
diff --git a/components/download/public/background_service/BUILD.gn b/components/download/public/background_service/BUILD.gn
index a276485..1cdb334 100644
--- a/components/download/public/background_service/BUILD.gn
+++ b/components/download/public/background_service/BUILD.gn
@@ -9,9 +9,10 @@
   import("//build/config/android/rules.gni")
 }
 
-source_set("public") {
+component("public") {
+  defines = [ "IS_COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_IMPL" ]
+
   sources = [
-    "background_download_service.cc",
     "background_download_service.h",
     "client.cc",
     "client.h",
@@ -52,10 +53,10 @@
     "//url",
   ]
 
-  if (!use_blink) {
-    public_deps += [ "//components/download/public/task:task_type" ]
-  } else {
+  if (use_blink) {
     public_deps += [ "//components/download/public/task:public" ]
+  } else {
+    public_deps += [ "//components/download/public/task:task_type" ]
   }
 
   configs += [ "//build/config/compiler:wexit_time_destructors" ]
diff --git a/components/download/public/background_service/background_download_service.cc b/components/download/public/background_service/background_download_service.cc
deleted file mode 100644
index c12bcdcf..0000000
--- a/components/download/public/background_service/background_download_service.cc
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/download/public/background_service/background_download_service.h"
-
-namespace download {
-#if BUILDFLAG(IS_IOS)
-const char kBackgroundDownloadIdentifierPrefix[] = "background_download";
-#endif  // BUILDFLAG(IS_IOS)
-}  // namespace download
diff --git a/components/download/public/background_service/background_download_service.h b/components/download/public/background_service/background_download_service.h
index 9e817cd..d23d0ae7 100644
--- a/components/download/public/background_service/background_download_service.h
+++ b/components/download/public/background_service/background_download_service.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <string>
 
+#include "base/component_export.h"
 #include "base/task/sequenced_task_runner.h"
 #include "components/download/public/background_service/clients.h"
 #include "components/download/public/task/download_task_types.h"
@@ -26,7 +27,8 @@
 
 #if BUILDFLAG(IS_IOS)
 // Identifier for background download service.
-extern const char kBackgroundDownloadIdentifierPrefix[];
+inline constexpr char kBackgroundDownloadIdentifierPrefix[] =
+    "background_download";
 #endif  // BUILDFLAG(IS_IOS)
 
 // A service responsible for helping facilitate the scheduling and downloading
@@ -38,7 +40,8 @@
 // interface so this class knows who to contact when a download completes after
 // a process restart.
 // See the embedder specific factories for creation options.
-class BackgroundDownloadService : public KeyedService {
+class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
+    BackgroundDownloadService : public KeyedService {
  public:
   // The current status of the Service.
   enum class ServiceStatus {
diff --git a/components/download/public/background_service/basic_task_scheduler.h b/components/download/public/background_service/basic_task_scheduler.h
index 09ed3ca4..fbb5e10b 100644
--- a/components/download/public/background_service/basic_task_scheduler.h
+++ b/components/download/public/background_service/basic_task_scheduler.h
@@ -8,6 +8,7 @@
 #include <map>
 
 #include "base/cancelable_callback.h"
+#include "base/component_export.h"
 #include "base/functional/callback.h"
 #include "base/memory/weak_ptr.h"
 #include "components/download/public/task/task_scheduler.h"
@@ -18,7 +19,8 @@
 
 // A TaskScheduler implementation that doesn't do anything but posts the task
 // after the specified delay.
-class BasicTaskScheduler : public download::TaskScheduler {
+class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
+    BasicTaskScheduler : public download::TaskScheduler {
  public:
   explicit BasicTaskScheduler(
       const base::RepeatingCallback<BackgroundDownloadService*()>&
diff --git a/components/download/public/background_service/blob_context_getter_factory.h b/components/download/public/background_service/blob_context_getter_factory.h
index 5a9920c2..ab269ef2 100644
--- a/components/download/public/background_service/blob_context_getter_factory.h
+++ b/components/download/public/background_service/blob_context_getter_factory.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_BLOB_CONTEXT_GETTER_FACTORY_H_
 #define COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_BLOB_CONTEXT_GETTER_FACTORY_H_
 
+#include "base/component_export.h"
 #include "base/functional/callback.h"
 #include "base/memory/weak_ptr.h"
 
@@ -19,7 +20,8 @@
 using BlobContextGetterCallback = base::OnceCallback<void(BlobContextGetter)>;
 
 // Retrieves a blob storage context getter on main thread.
-class BlobContextGetterFactory {
+class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
+    BlobContextGetterFactory {
  public:
   virtual void RetrieveBlobContextGetter(
       BlobContextGetterCallback callback) = 0;
diff --git a/components/download/public/background_service/client.h b/components/download/public/background_service/client.h
index 04bc6874..a509f64 100644
--- a/components/download/public/background_service/client.h
+++ b/components/download/public/background_service/client.h
@@ -8,6 +8,7 @@
 #include <string>
 #include <vector>
 
+#include "base/component_export.h"
 #include "base/functional/callback.h"
 #include "net/http/http_response_headers.h"
 #include "url/gurl.h"
@@ -27,7 +28,7 @@
 // The Client interface required by any feature that wants to start a download
 // through the DownloadService.  Should be registered immediately at startup
 // when the DownloadService is created (see the factory).
-class Client {
+class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE) Client {
  public:
   // Used by OnDownloadFailed to determine the reason of the abort.
   enum class FailureReason {
diff --git a/components/download/public/background_service/clients.h b/components/download/public/background_service/clients.h
index d254705..6bf051c 100644
--- a/components/download/public/background_service/clients.h
+++ b/components/download/public/background_service/clients.h
@@ -9,6 +9,7 @@
 #include <memory>
 #include <string>
 
+#include "base/component_export.h"
 #include "components/download/public/background_service/client.h"
 
 namespace download {
@@ -53,6 +54,7 @@
 // Get a string that represents a particular client. Used in histograms and
 // debugging web UI. Must never change existing value and sync value with
 // variants "DownloadClient" in histograms.xml.
+COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
 std::string BackgroundDownloadClientToString(DownloadClient client);
 
 using DownloadClientMap = std::map<DownloadClient, std::unique_ptr<Client>>;
diff --git a/components/download/public/background_service/download_metadata.h b/components/download/public/background_service/download_metadata.h
index eaa01ce..1c4c77d 100644
--- a/components/download/public/background_service/download_metadata.h
+++ b/components/download/public/background_service/download_metadata.h
@@ -8,6 +8,7 @@
 #include <optional>
 #include <vector>
 
+#include "base/component_export.h"
 #include "base/files/file_path.h"
 #include "base/memory/scoped_refptr.h"
 #include "build/blink_buildflags.h"
@@ -23,7 +24,8 @@
 namespace download {
 
 // Struct that contains information about successfully completed downloads.
-struct CompletionInfo {
+struct COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
+    CompletionInfo {
   // The file path for the download file. In incognito mode, use |blob_handle_|
   // to retrieve data.
   base::FilePath path;
@@ -68,7 +70,8 @@
 };
 
 // Struct to describe general download status.
-struct DownloadMetaData {
+struct COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
+    DownloadMetaData {
   // The GUID of the download.
   std::string guid;
 
diff --git a/components/download/public/background_service/download_params.h b/components/download/public/background_service/download_params.h
index b6b58c4..8d539cb 100644
--- a/components/download/public/background_service/download_params.h
+++ b/components/download/public/background_service/download_params.h
@@ -9,6 +9,7 @@
 #include <optional>
 #include <string>
 
+#include "base/component_export.h"
 #include "base/functional/callback.h"
 #include "base/time/time.h"
 #include "components/download/public/background_service/clients.h"
@@ -24,7 +25,8 @@
 // specify restrictions on what impact this download will have on the device
 // (battery, network conditions, priority, etc.). On iOS, the network and
 // battery requirements are mapped to NSURLSessionConfiguration.discretionary.
-struct SchedulingParams {
+struct COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
+    SchedulingParams {
  public:
   enum class NetworkRequirements {
     // The download can occur under all network conditions.
@@ -99,7 +101,8 @@
 };
 
 // The parameters describing how to build the request when starting a download.
-struct RequestParams {
+struct COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
+    RequestParams {
  public:
   RequestParams();
   RequestParams(const RequestParams& other);
@@ -137,7 +140,8 @@
 // The parameters that describe a download request made to the DownloadService.
 // The |client| needs to be properly created and registered for this service for
 // the download to be accepted.
-struct DownloadParams {
+struct COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
+    DownloadParams {
   using CustomData = std::map<std::string, std::string>;
 
   enum StartResult {
diff --git a/components/download/public/background_service/features.h b/components/download/public/background_service/features.h
index 3224dfd..ad2ff54 100644
--- a/components/download/public/background_service/features.h
+++ b/components/download/public/background_service/features.h
@@ -5,17 +5,20 @@
 #ifndef COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_FEATURES_H_
 #define COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_FEATURES_H_
 
+#include "base/component_export.h"
 #include "base/feature_list.h"
 
 namespace download {
 
 // Used to set configuration of download service through Finch. This is not used
 // to turn on/off the feature.
+COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
 BASE_DECLARE_FEATURE(kDownloadServiceFeature);
 
 // Enable download service to download in foreground.
 // TODO(crbug.com/40190949): This is for iOS only and temporary fix to
 // circumvent issues with background downloads reported as crashes.
+COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
 BASE_DECLARE_FEATURE(kDownloadServiceForegroundSessionIOSFeature);
 
 }  // namespace download
diff --git a/components/download/public/background_service/logger.h b/components/download/public/background_service/logger.h
index e751e464..3575fcc4 100644
--- a/components/download/public/background_service/logger.h
+++ b/components/download/public/background_service/logger.h
@@ -5,13 +5,14 @@
 #ifndef COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_LOGGER_H_
 #define COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_LOGGER_H_
 
+#include "base/component_export.h"
 #include "base/values.h"
 
 namespace download {
 
 // A helper class to expose internals of the downloads system to a logging
 // component and/or debug UI.
-class Logger {
+class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE) Logger {
  public:
   // An Observer to be notified of any DownloadService changes.
   class Observer {
diff --git a/components/download/public/background_service/navigation_monitor.h b/components/download/public/background_service/navigation_monitor.h
index 72c2e21..da7fb96 100644
--- a/components/download/public/background_service/navigation_monitor.h
+++ b/components/download/public/background_service/navigation_monitor.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_NAVIGATION_MONITOR_H_
 #define COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_NAVIGATION_MONITOR_H_
 
+#include "base/component_export.h"
 #include "base/time/time.h"
 #include "components/keyed_service/core/keyed_service.h"
 
@@ -25,7 +26,8 @@
 // NavigationMonitor does NOT has ownership of WebContentsObserver, and is
 // essentially a decoupled singleton that glues download service with
 // WebContents and WebContentsObserver.
-class NavigationMonitor : public KeyedService {
+class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
+    NavigationMonitor : public KeyedService {
  public:
   // Used to propagates the navigation events.
   class Observer {
diff --git a/components/download/public/background_service/service_config.h b/components/download/public/background_service/service_config.h
index a4efb62b..a60f82703 100644
--- a/components/download/public/background_service/service_config.h
+++ b/components/download/public/background_service/service_config.h
@@ -7,6 +7,8 @@
 
 #include <stdint.h>
 
+#include "base/component_export.h"
+
 namespace base {
 class TimeDelta;
 }  // namespace base
@@ -16,7 +18,8 @@
 // Contains the configuration used by this DownloadService for internal download
 // operations.  Meant to be used by Clients for any tweaking they might want to
 // do based on the configuration parameters.
-class ServiceConfig {
+class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
+    ServiceConfig {
  public:
   virtual ~ServiceConfig() = default;
 
diff --git a/components/download/public/task/BUILD.gn b/components/download/public/task/BUILD.gn
index e8adf0e9..1bd1180 100644
--- a/components/download/public/task/BUILD.gn
+++ b/components/download/public/task/BUILD.gn
@@ -7,7 +7,9 @@
   import("//build/config/android/rules.gni")
 }
 
-source_set("public") {
+component("public") {
+  defines = [ "IS_COMPONENTS_DOWNLOAD_PUBLIC_TASK_IMPL" ]
+
   sources = [
     "empty_task_scheduler.cc",
     "empty_task_scheduler.h",
diff --git a/components/download/public/task/empty_task_scheduler.h b/components/download/public/task/empty_task_scheduler.h
index 98ba207..58cd43f9 100644
--- a/components/download/public/task/empty_task_scheduler.h
+++ b/components/download/public/task/empty_task_scheduler.h
@@ -7,12 +7,14 @@
 
 #include <stdint.h>
 
+#include "base/component_export.h"
 #include "components/download/public/task/task_scheduler.h"
 
 namespace download {
 
 // Task scheduler that does nothing for incognito mode.
-class EmptyTaskScheduler : public TaskScheduler {
+class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_TASK) EmptyTaskScheduler
+    : public TaskScheduler {
  public:
   EmptyTaskScheduler();
 
diff --git a/components/download/public/task/task_manager.h b/components/download/public/task/task_manager.h
index eff6ac06..dee18e3 100644
--- a/components/download/public/task/task_manager.h
+++ b/components/download/public/task/task_manager.h
@@ -7,6 +7,7 @@
 
 #include <stdint.h>
 
+#include "base/component_export.h"
 #include "base/functional/callback.h"
 #include "components/download/public/task/download_task_types.h"
 
@@ -19,10 +20,10 @@
 // independently of each other as long as they have different |task_type|.
 // Scheduling another task of same |task_type| before the task is started will
 // overwrite the params of the scheduled task.
-class TaskManager {
+class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_TASK) TaskManager {
  public:
   // Params used when scheduling a task through TaskScheduler::ScheduleTask().
-  struct TaskParams {
+  struct COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_TASK) TaskParams {
     TaskParams();
     ~TaskParams() = default;
     bool operator==(const TaskParams& other) const;
diff --git a/components/download/public/task/task_manager_impl.h b/components/download/public/task/task_manager_impl.h
index ca520e8..afcf4ee 100644
--- a/components/download/public/task/task_manager_impl.h
+++ b/components/download/public/task/task_manager_impl.h
@@ -6,8 +6,10 @@
 #define COMPONENTS_DOWNLOAD_PUBLIC_TASK_TASK_MANAGER_IMPL_H_
 
 #include <stdint.h>
+
 #include <map>
 
+#include "base/component_export.h"
 #include "components/download/public/task/task_manager.h"
 #include "components/download/public/task/task_scheduler.h"
 
@@ -20,7 +22,8 @@
 // independently of each other as long as they have different |task_type|.
 // Scheduling another task of same |task_type| before the task is started will
 // overwrite the params of the scheduled task.
-class TaskManagerImpl : public TaskManager {
+class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_TASK) TaskManagerImpl
+    : public TaskManager {
  public:
   explicit TaskManagerImpl(std::unique_ptr<TaskScheduler> task_scheduler);
 
diff --git a/components/download/public/task/task_scheduler.h b/components/download/public/task/task_scheduler.h
index 5dd11dc..a566043dc 100644
--- a/components/download/public/task/task_scheduler.h
+++ b/components/download/public/task/task_scheduler.h
@@ -7,6 +7,7 @@
 
 #include <stdint.h>
 
+#include "base/component_export.h"
 #include "components/download/public/task/download_task_types.h"
 
 namespace download {
@@ -15,7 +16,7 @@
 // tasks can run independently of each other as long as they have different
 // |task_type|. Scheduling another task of same |task_type| before the task is
 // fired will cancel the previous task.
-class TaskScheduler {
+class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_TASK) TaskScheduler {
  public:
   // Schedules a task with the operating system. The system has the liberty of
   // firing the task any time between |window_start_time_seconds| and
diff --git a/components/exo/surface.cc b/components/exo/surface.cc
index 77a21ded..a64c35e 100644
--- a/components/exo/surface.cc
+++ b/components/exo/surface.cc
@@ -234,7 +234,9 @@
 
   // Overridden from aura::WindowDelegate:
   gfx::Size GetMinimumSize() const override { return gfx::Size(); }
-  gfx::Size GetMaximumSize() const override { return gfx::Size(); }
+  std::optional<gfx::Size> GetMaximumSize() const override {
+    return gfx::Size();
+  }
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override {}
   gfx::NativeCursor GetCursor(const gfx::Point& point) override {
diff --git a/components/feed/core/v2/proto_util.cc b/components/feed/core/v2/proto_util.cc
index b299c71..35b788a 100644
--- a/components/feed/core/v2/proto_util.cc
+++ b/components/feed/core/v2/proto_util.cc
@@ -143,7 +143,8 @@
 #if BUILDFLAG(IS_ANDROID)
         Capability::SYNC_STRING_REMOVAL,
 #endif
-        Capability::SPORTS_IN_GAME_UPDATE}) {
+        Capability::SPORTS_IN_GAME_UPDATE,
+        Capability::INFO_CARD_ACKNOWLEDGEMENT_TRACKING}) {
     feed_request.add_client_capability(capability);
   }
 
@@ -174,11 +175,6 @@
     feed_request.add_client_capability(Capability::ON_DEVICE_VIEW_HISTORY);
   }
 
-  if (base::FeatureList::IsEnabled(kInfoCardAcknowledgementTracking)) {
-    feed_request.add_client_capability(
-        Capability::INFO_CARD_ACKNOWLEDGEMENT_TRACKING);
-  }
-
   if (base::FeatureList::IsEnabled(kSyntheticCapabilities)) {
     feed_request.add_client_capability(Capability::SYNTHETIC_CAPABILITIES);
   }
diff --git a/components/feed/core/v2/proto_util_unittest.cc b/components/feed/core/v2/proto_util_unittest.cc
index 8a73f00..24d2501c 100644
--- a/components/feed/core/v2/proto_util_unittest.cc
+++ b/components/feed/core/v2/proto_util_unittest.cc
@@ -277,22 +277,6 @@
             feedwire::FeedEntryPointSource::CHROME_SINGLE_WEB_FEED_MENU);
 }
 
-TEST(ProtoUtilTest, InfoCardAcknowledgementTrackingDisabled) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures({}, {kInfoCardAcknowledgementTracking});
-  feedwire::FeedRequest request =
-      CreateFeedQueryRefreshRequest(
-          StreamType(StreamKind::kForYou), feedwire::FeedQuery::MANUAL_REFRESH,
-          /*request_metadata=*/{},
-          /*consistency_token=*/std::string(), SingleWebFeedEntryPoint::kOther,
-          /*doc_view_counts=*/{})
-          .feed_request();
-
-  ASSERT_THAT(
-      request.client_capability(),
-      Not(Contains(feedwire::Capability::INFO_CARD_ACKNOWLEDGEMENT_TRACKING)));
-}
-
 TEST(ProtoUtilTest, FeedSignedOutViewDemotionEnablesCapability) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures({kFeedSignedOutViewDemotion}, {});
diff --git a/components/feed/feed_feature_list.cc b/components/feed/feed_feature_list.cc
index 7fb6061..9b1eb2f 100644
--- a/components/feed/feed_feature_list.cc
+++ b/components/feed/feed_feature_list.cc
@@ -65,10 +65,6 @@
   return signin::ConsentLevel::kSignin;
 }
 
-BASE_FEATURE(kInfoCardAcknowledgementTracking,
-             "InfoCardAcknowledgementTracking",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 BASE_FEATURE(kFeedNoViewCache,
              "FeedNoViewCache",
              base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/components/feed/feed_feature_list.h b/components/feed/feed_feature_list.h
index b0f8bc7..ea79901 100644
--- a/components/feed/feed_feature_list.h
+++ b/components/feed/feed_feature_list.h
@@ -75,10 +75,6 @@
 COMPONENT_EXPORT(COMPONENTS_FEED_FEATURE_LIST)
 signin::ConsentLevel GetConsentLevelNeededForPersonalizedFeed();
 
-// Feature that enables tracking the acknowledgement state for the info cards.
-COMPONENT_EXPORT(COMPONENTS_FEED_FEATURE_LIST)
-BASE_DECLARE_FEATURE(kInfoCardAcknowledgementTracking);
-
 // When enabled, no view cache is used.
 COMPONENT_EXPORT(COMPONENTS_FEED_FEATURE_LIST)
 BASE_DECLARE_FEATURE(kFeedNoViewCache);
diff --git a/components/gwp_asan/client/extreme_lightweight_detector_malloc_shims_unittest.cc b/components/gwp_asan/client/extreme_lightweight_detector_malloc_shims_unittest.cc
index 6d129e00..70aba60 100644
--- a/components/gwp_asan/client/extreme_lightweight_detector_malloc_shims_unittest.cc
+++ b/components/gwp_asan/client/extreme_lightweight_detector_malloc_shims_unittest.cc
@@ -38,7 +38,7 @@
 #else
         allocator_shim::EnableBrp(false),
 #endif
-        allocator_shim::EnableMemoryTagging(false),
+        /*brp_extra_extras_size=*/0, allocator_shim::EnableMemoryTagging(false),
         partition_alloc::TagViolationReportingMode::kDisabled,
         allocator_shim::BucketDistribution::kNeutral,
         allocator_shim::SchedulerLoopQuarantine(false),
diff --git a/components/history_clusters/history_clusters_internals/webui/BUILD.gn b/components/history_clusters/history_clusters_internals/webui/BUILD.gn
index e57cb01..1e8f476 100644
--- a/components/history_clusters/history_clusters_internals/webui/BUILD.gn
+++ b/components/history_clusters/history_clusters_internals/webui/BUILD.gn
@@ -18,6 +18,7 @@
     "//components/history_clusters/core",
     "//components/history_clusters/history_clusters_internals/resources:resources",
     "//components/history_clusters/history_clusters_internals/webui:mojo_bindings",
+    "//content/public/browser",
     "//third_party/abseil-cpp:absl",
     "//ui/base",
     "//ui/webui",
diff --git a/components/history_clusters/history_clusters_internals/webui/DEPS b/components/history_clusters/history_clusters_internals/webui/DEPS
index bae431e..0c5cc0a 100644
--- a/components/history_clusters/history_clusters_internals/webui/DEPS
+++ b/components/history_clusters/history_clusters_internals/webui/DEPS
@@ -2,7 +2,9 @@
   "+components/grit/history_clusters_internals_resources.h",
   "+components/grit/history_clusters_internals_resources_map.h",
   "+components/history/core/browser",
+  "+content/public/browser",
   "+mojo/public/cpp/bindings",
   "+ui/base/webui/resource_path.h",
   "+ui/webui/mojo_web_ui_controller.h",
+  "+ui/webui/webui_util.h",
 ]
diff --git a/components/history_clusters/history_clusters_internals/webui/history_clusters_internals_ui.cc b/components/history_clusters/history_clusters_internals/webui/history_clusters_internals_ui.cc
index 6d56349..36d9a2b 100644
--- a/components/history_clusters/history_clusters_internals/webui/history_clusters_internals_ui.cc
+++ b/components/history_clusters/history_clusters_internals/webui/history_clusters_internals_ui.cc
@@ -12,18 +12,24 @@
 #include "components/grit/history_clusters_internals_resources.h"
 #include "components/grit/history_clusters_internals_resources_map.h"
 #include "components/history_clusters/history_clusters_internals/webui/history_clusters_internals_page_handler_impl.h"
+#include "components/history_clusters/history_clusters_internals/webui/url_constants.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/webui/webui_util.h"
 
 HistoryClustersInternalsUI::HistoryClustersInternalsUI(
     content::WebUI* web_ui,
     history_clusters::HistoryClustersService* history_clusters_service,
-    history::HistoryService* history_service,
-    SetupWebUIDataSourceCallback set_up_data_source_callback)
+    history::HistoryService* history_service)
     : MojoWebUIController(web_ui, /*enable_chrome_send=*/true),
       history_clusters_service_(history_clusters_service),
       history_service_(history_service) {
-  std::move(set_up_data_source_callback)
-      .Run(base::span(kHistoryClustersInternalsResources),
-           IDR_HISTORY_CLUSTERS_INTERNALS_HISTORY_CLUSTERS_INTERNALS_HTML);
+  content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
+      web_ui->GetWebContents()->GetBrowserContext(),
+      history_clusters_internals::kChromeUIHistoryClustersInternalsHost);
+  webui::SetupWebUIDataSource(
+      source, kHistoryClustersInternalsResources,
+      IDR_HISTORY_CLUSTERS_INTERNALS_HISTORY_CLUSTERS_INTERNALS_HTML);
 }
 
 HistoryClustersInternalsUI::~HistoryClustersInternalsUI() = default;
diff --git a/components/history_clusters/history_clusters_internals/webui/history_clusters_internals_ui.h b/components/history_clusters/history_clusters_internals/webui/history_clusters_internals_ui.h
index d35ff11..4c2d397 100644
--- a/components/history_clusters/history_clusters_internals/webui/history_clusters_internals_ui.h
+++ b/components/history_clusters/history_clusters_internals/webui/history_clusters_internals_ui.h
@@ -32,8 +32,7 @@
   explicit HistoryClustersInternalsUI(
       content::WebUI* web_ui,
       history_clusters::HistoryClustersService* history_clusters_service,
-      history::HistoryService* history_service,
-      SetupWebUIDataSourceCallback set_up_data_source_callback);
+      history::HistoryService* history_service);
   ~HistoryClustersInternalsUI() override;
 
   HistoryClustersInternalsUI(const HistoryClustersInternalsUI&) = delete;
diff --git a/components/keyed_service/core/keyed_service_templated_factory.cc b/components/keyed_service/core/keyed_service_templated_factory.cc
index 4c642cba..957c06f 100644
--- a/components/keyed_service/core/keyed_service_templated_factory.cc
+++ b/components/keyed_service/core/keyed_service_templated_factory.cc
@@ -12,6 +12,7 @@
 #include "base/containers/contains.h"
 #include "base/containers/flat_map.h"
 #include "base/functional/callback.h"
+#include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/no_destructor.h"
 #include "components/keyed_service/core/dependency_manager.h"
@@ -232,7 +233,7 @@
 
   iterator->second.stage = MappingStage::kServiceShutdown;
   if (iterator->second.service) {
-    if constexpr (base::internal::IsRefCountedType<ServiceType>) {
+    if constexpr (base::IsRefCountedType<ServiceType>) {
       iterator->second.service->ShutdownOnUIThread();
     } else {
       iterator->second.service->Shutdown();
diff --git a/components/keyed_service/core/keyed_service_templated_factory.h b/components/keyed_service/core/keyed_service_templated_factory.h
index 810cd1f..ec2aa767 100644
--- a/components/keyed_service/core/keyed_service_templated_factory.h
+++ b/components/keyed_service/core/keyed_service_templated_factory.h
@@ -12,7 +12,7 @@
 
 #include "base/containers/flat_map.h"
 #include "base/functional/callback_forward.h"
-#include "base/memory/raw_scoped_refptr_mismatch_checker.h"
+#include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
 #include "components/keyed_service/core/features_buildflags.h"
 #include "components/keyed_service/core/keyed_service_base_factory.h"
@@ -34,14 +34,13 @@
 
  protected:
   // Non-owning pointer to `ServiceType`.
-  using ServicePtr =
-      std::conditional_t<base::internal::IsRefCountedType<ServiceType>,
-                         scoped_refptr<ServiceType>,
-                         ServiceType*>;
+  using ServicePtr = std::conditional_t<base::IsRefCountedType<ServiceType>,
+                                        scoped_refptr<ServiceType>,
+                                        ServiceType*>;
 
   // Owning pointer to `ServiceType`.
   using OwnedServicePtr =
-      std::conditional_t<base::internal::IsRefCountedType<ServiceType>,
+      std::conditional_t<base::IsRefCountedType<ServiceType>,
                          scoped_refptr<ServiceType>,
                          std::unique_ptr<ServiceType>>;
 
diff --git a/components/language_detection/content/browser/content_language_detection_driver.cc b/components/language_detection/content/browser/content_language_detection_driver.cc
index 9111f17..ab257f6 100644
--- a/components/language_detection/content/browser/content_language_detection_driver.cc
+++ b/components/language_detection/content/browser/content_language_detection_driver.cc
@@ -32,4 +32,19 @@
       std::move(callback));
 }
 
+void ContentLanguageDetectionDriver::GetLanguageDetectionModelStatus(
+    GetLanguageDetectionModelStatusCallback callback) {
+  if (!language_detection_model_provider_) {
+    // TODO (crbug.com/383022111): Pass the model availability based on the
+    // real-time status of the model (if the model is unloaded).
+    std::move(callback).Run(mojom::LanguageDetectionModelStatus::kNotAvailable);
+    return;
+  }
+  if (language_detection_model_provider_->HasValidModelFile()) {
+    std::move(callback).Run(mojom::LanguageDetectionModelStatus::kReadily);
+    return;
+  }
+  std::move(callback).Run(mojom::LanguageDetectionModelStatus::kAfterDownload);
+}
+
 }  // namespace language_detection
diff --git a/components/language_detection/content/browser/content_language_detection_driver.h b/components/language_detection/content/browser/content_language_detection_driver.h
index aaa2db74..91e34d2 100644
--- a/components/language_detection/content/browser/content_language_detection_driver.h
+++ b/components/language_detection/content/browser/content_language_detection_driver.h
@@ -43,6 +43,9 @@
   void GetLanguageDetectionModel(
       GetLanguageDetectionModelCallback callback) override;
 
+  void GetLanguageDetectionModelStatus(
+      GetLanguageDetectionModelStatusCallback callback) override;
+
  protected:
   // Notifies `this` that the translate model service is available for model
   // requests or is invalidating existing requests specified by `is_available`.
diff --git a/components/language_detection/content/common/language_detection.mojom b/components/language_detection/content/common/language_detection.mojom
index fa0cafda..99bc312 100644
--- a/components/language_detection/content/common/language_detection.mojom
+++ b/components/language_detection/content/common/language_detection.mojom
@@ -6,9 +6,26 @@
 
 import "mojo/public/mojom/base/file.mojom";
 
+// The model file status of the language detection model.
+enum LanguageDetectionModelStatus {
+  // The model file is currently available. However the model may be
+  // reset due to future updates.
+  kReadily = 0,
+  // The model file is currently not available but may be downloaded.
+  kAfterDownload = 1,
+  // The model file is not available because of errors and cannot be downloaded.
+  kNotAvailable = 2,
+};
+
 // Provides the language detection model. The browser provides this interface
 // so that the renderer can access the language model file.
 interface ContentLanguageDetectionDriver {
   // Request that the language detection model be loaded and returned.
   GetLanguageDetectionModel() => (mojo_base.mojom.ReadOnlyFile? model_file);
+
+  // Check if the language detection model has been downloaded.
+  // The function only returns the call-time status and the model availability
+  // may change when `GetLanguageDetectionModel` is called so the returned
+  // `model_file` must still be checked.
+  GetLanguageDetectionModelStatus() => (LanguageDetectionModelStatus status);
 };
diff --git a/components/language_detection/content/renderer/language_detection_model_manager.cc b/components/language_detection/content/renderer/language_detection_model_manager.cc
index d3c9e10..f25247c9 100644
--- a/components/language_detection/content/renderer/language_detection_model_manager.cc
+++ b/components/language_detection/content/renderer/language_detection_model_manager.cc
@@ -66,6 +66,13 @@
           weak_pointer_factory_.GetWeakPtr(), std::move(callback)));
 }
 
+void LanguageDetectionModelManager::GetLanguageDetectionModelStatus(
+    const blink::BrowserInterfaceBrokerProxy& interface_broker,
+    GetLanguageDetectionModelStatusCallback callback) {
+  GetLanguageDetectionDriver(interface_broker)
+      ->GetLanguageDetectionModelStatus(std::move(callback));
+}
+
 mojo::Remote<mojom::ContentLanguageDetectionDriver>&
 LanguageDetectionModelManager::GetLanguageDetectionDriver(
     const blink::BrowserInterfaceBrokerProxy& interface_broker) {
diff --git a/components/language_detection/content/renderer/language_detection_model_manager.h b/components/language_detection/content/renderer/language_detection_model_manager.h
index e16484d2e..6cd80a3 100644
--- a/components/language_detection/content/renderer/language_detection_model_manager.h
+++ b/components/language_detection/content/renderer/language_detection_model_manager.h
@@ -30,6 +30,8 @@
   // `nullptr` indicates that no valid model could be loaded.
   using GetLanuageDetectionModelCallback =
       base::OnceCallback<void(LanguageDetectionModel* model)>;
+  using GetLanguageDetectionModelStatusCallback = language_detection::mojom::
+      ContentLanguageDetectionDriver::GetLanguageDetectionModelStatusCallback;
 
   // Passes a model to `callback`. If no valid model can possibly be loaded, an
   // invalid model will be passed. If the current model is valid, this will
@@ -40,6 +42,11 @@
       const blink::BrowserInterfaceBrokerProxy& interface_broker,
       GetLanuageDetectionModelCallback callback);
 
+  // Checks if the model has been downloaded in the browser process.
+  void GetLanguageDetectionModelStatus(
+      const blink::BrowserInterfaceBrokerProxy& interface_broker,
+      GetLanguageDetectionModelStatusCallback callback);
+
  private:
   // Ensures that the driver is connected before returning it.
   mojo::Remote<mojom::ContentLanguageDetectionDriver>&
diff --git a/components/language_detection/core/browser/BUILD.gn b/components/language_detection/core/browser/BUILD.gn
index 223f36a..4b03baa 100644
--- a/components/language_detection/core/browser/BUILD.gn
+++ b/components/language_detection/core/browser/BUILD.gn
@@ -20,3 +20,14 @@
     "//mojo/public/cpp/bindings",
   ]
 }
+
+source_set("unit_tests") {
+  testonly = true
+  sources = [ "language_detection_model_provider_unittest.cc" ]
+  deps = [
+    ":language_detection_model_service",
+    "//base",
+    "//base/test:test_support",
+    "//components/language_detection/testing",
+  ]
+}
diff --git a/components/language_detection/core/browser/language_detection_model_provider.cc b/components/language_detection/core/browser/language_detection_model_provider.cc
index ae16835..351651c 100644
--- a/components/language_detection/core/browser/language_detection_model_provider.cc
+++ b/components/language_detection/core/browser/language_detection_model_provider.cc
@@ -110,4 +110,12 @@
 
   PostGetModelCallback(std::move(callback), base::File());
 }
+
+bool LanguageDetectionModelProvider::HasValidModelFile() {
+  if (!has_model_ever_been_set_) {
+    return false;
+  }
+  return language_detection_model_file_.GetFile().IsValid();
+}
+
 }  // namespace language_detection
diff --git a/components/language_detection/core/browser/language_detection_model_provider.h b/components/language_detection/core/browser/language_detection_model_provider.h
index 63f453e..ff100a8d 100644
--- a/components/language_detection/core/browser/language_detection_model_provider.h
+++ b/components/language_detection/core/browser/language_detection_model_provider.h
@@ -53,6 +53,10 @@
   // valid file occurs.
   void UnloadModelFile();
 
+  // Returns whether a valid model is available. The method will return false if
+  // `has_model_ever_been_set_ == false` or the model file is invalid.
+  bool HasValidModelFile();
+
  private:
   // Replaces the current model file with a new one. It is careful to
   // open/close files as necessary on a background thread.
diff --git a/components/language_detection/core/browser/language_detection_model_provider_unittest.cc b/components/language_detection/core/browser/language_detection_model_provider_unittest.cc
new file mode 100644
index 0000000..a8434185
--- /dev/null
+++ b/components/language_detection/core/browser/language_detection_model_provider_unittest.cc
@@ -0,0 +1,42 @@
+// 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 "components/language_detection/core/browser/language_detection_model_provider.h"
+
+#include "base/test/task_environment.h"
+#include "components/language_detection/testing/language_detection_test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace language_detection {
+
+class LanguageDetectionModelProviderTest : public testing::Test {
+ protected:
+  base::test::TaskEnvironment environment_;
+};
+
+TEST_F(LanguageDetectionModelProviderTest, NoModelSet) {
+  LanguageDetectionModelProvider provider(
+      environment_.GetMainThreadTaskRunner());
+  EXPECT_FALSE(provider.HasValidModelFile());
+}
+
+TEST_F(LanguageDetectionModelProviderTest, SetModelAndUnload) {
+  base::RunLoop run_loop;
+  LanguageDetectionModelProvider provider(
+      environment_.GetMainThreadTaskRunner());
+  ASSERT_FALSE(provider.HasValidModelFile());
+  provider.GetLanguageDetectionModelFile(base::BindOnce(
+      [](base::RepeatingClosure quit_closure, base::File model_file) {
+        EXPECT_TRUE(model_file.IsValid());
+        quit_closure.Run();
+      },
+      run_loop.QuitClosure()));
+  provider.ReplaceModelFile(GetValidModelFilePath());
+  run_loop.Run();
+  ASSERT_TRUE(provider.HasValidModelFile());
+  provider.UnloadModelFile();
+  ASSERT_FALSE(provider.HasValidModelFile());
+}
+
+}  // namespace language_detection
diff --git a/components/language_detection/core/language_detection_model.cc b/components/language_detection/core/language_detection_model.cc
index 9cf8e60a..c35782e 100644
--- a/components/language_detection/core/language_detection_model.cc
+++ b/components/language_detection/core/language_detection_model.cc
@@ -241,17 +241,22 @@
 
 void LanguageDetectionModel::UpdateWithFile(base::File model_file) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  SetModel(LoadModelFromFile(std::move(model_file), num_threads_));
+  const int64_t model_file_size =
+      model_file.IsValid() ? model_file.GetLength() : 0;
+  SetModel(model_file_size,
+           LoadModelFromFile(std::move(model_file), num_threads_));
 }
 
 void LanguageDetectionModel::UpdateWithFileAsync(base::File model_file,
                                                  base::OnceClosure callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  const int64_t model_file_size =
+      model_file.IsValid() ? model_file.GetLength() : 0;
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
       base::BindOnce(&LoadModelFromFile, std::move(model_file), num_threads_),
       base::BindOnce(&LanguageDetectionModel::SetModel,
-                     weak_factory_.GetWeakPtr())
+                     weak_factory_.GetWeakPtr(), model_file_size)
           .Then(std::move(callback)));
 }
 
@@ -260,6 +265,13 @@
   return lang_detection_model_ != nullptr;
 }
 
+int64_t LanguageDetectionModel::GetModelSize() const {
+  if (!IsAvailable()) {
+    return 0;
+  }
+  return model_file_size_;
+}
+
 std::string LanguageDetectionModel::GetModelVersion() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // TODO(crbug.com/40748826): Return the model version provided
@@ -268,9 +280,11 @@
 }
 
 void LanguageDetectionModel::SetModel(
+    int64_t model_file_size,
     std::optional<OwnedNLClassifier> optional_model) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (optional_model.has_value()) {
+    model_file_size_ = model_file_size;
     lang_detection_model_ = std::move(optional_model).value();
   }
   NotifyModelLoaded();
diff --git a/components/language_detection/core/language_detection_model.h b/components/language_detection/core/language_detection_model.h
index b884fb8..29014f3 100644
--- a/components/language_detection/core/language_detection_model.h
+++ b/components/language_detection/core/language_detection_model.h
@@ -118,6 +118,10 @@
   // to determine the language of the page.
   bool IsAvailable() const;
 
+  // Returns the size of the loaded model in bytes. If the model is not yet
+  // available, the method will return 0.
+  int64_t GetModelSize() const;
+
   void AddOnModelLoadedCallback(ModelLoadedCallback callback);
 
   std::string GetModelVersion() const;
@@ -150,7 +154,8 @@
       std::unique_ptr<tflite::task::text::nlclassifier::NLClassifier>;
 
   // Updates the model if the not unset.
-  void SetModel(std::optional<OwnedNLClassifier> optional_model);
+  void SetModel(int64_t model_file_size,
+                std::optional<OwnedNLClassifier> optional_model);
 
   SEQUENCE_CHECKER(sequence_checker_);
 
@@ -168,6 +173,10 @@
   // Records whether a file has been updated to the model.
   bool loaded_ = false;
 
+  // Records the size of the model file loaded. The value is only valid when
+  // loaded_ is True.
+  int64_t model_file_size_ = 0;
+
   // Used to load the data on a background sequence (see UpdateWithFileAsync).
   base::WeakPtrFactory<LanguageDetectionModel> weak_factory_{this};
 };
diff --git a/components/language_detection/testing/language_detection_test_utils.cc b/components/language_detection/testing/language_detection_test_utils.cc
index fb220be..37d60f7f 100644
--- a/components/language_detection/testing/language_detection_test_utils.cc
+++ b/components/language_detection/testing/language_detection_test_utils.cc
@@ -15,15 +15,18 @@
 #include "gtest/gtest.h"
 
 namespace language_detection {
-base::File GetValidModelFile() {
+base::FilePath GetValidModelFilePath() {
   base::FilePath source_root_dir;
   base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &source_root_dir);
-  base::FilePath model_file_path = source_root_dir.AppendASCII("components")
-                                       .AppendASCII("test")
-                                       .AppendASCII("data")
-                                       .AppendASCII("translate")
-                                       .AppendASCII("valid_model.tflite");
-  base::File file(model_file_path,
+  return source_root_dir.AppendASCII("components")
+      .AppendASCII("test")
+      .AppendASCII("data")
+      .AppendASCII("translate")
+      .AppendASCII("valid_model.tflite");
+}
+
+base::File GetValidModelFile() {
+  base::File file(GetValidModelFilePath(),
                   (base::File::FLAG_OPEN | base::File::FLAG_READ));
   return file;
 }
diff --git a/components/language_detection/testing/language_detection_test_utils.h b/components/language_detection/testing/language_detection_test_utils.h
index 7559747..a02b353 100644
--- a/components/language_detection/testing/language_detection_test_utils.h
+++ b/components/language_detection/testing/language_detection_test_utils.h
@@ -10,6 +10,9 @@
 namespace language_detection {
 class LanguageDetectionModel;
 
+// Returns a `base::FilePath` for the valid model file.
+base::FilePath GetValidModelFilePath();
+
 // Returns a `base::File` for the valid model file.
 base::File GetValidModelFile();
 
diff --git a/components/leveldb_proto/internal/proto_leveldb_wrapper.h b/components/leveldb_proto/internal/proto_leveldb_wrapper.h
index 8826c2f..81345ef 100644
--- a/components/leveldb_proto/internal/proto_leveldb_wrapper.h
+++ b/components/leveldb_proto/internal/proto_leveldb_wrapper.h
@@ -151,7 +151,7 @@
   // Used to run blocking tasks in-order, must be the TaskRunner that |db_|
   // relies on.
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
-  raw_ptr<LevelDB> db_ = nullptr;
+  raw_ptr<LevelDB, AcrossTasksDanglingUntriaged> db_ = nullptr;
 
   // The identifier used when recording metrics to determine the source of the
   // LevelDB calls, likely the database client name.
diff --git a/components/leveldb_proto/internal/unique_proto_database_unittest.cc b/components/leveldb_proto/internal/unique_proto_database_unittest.cc
index 240bd27..0afe16c 100644
--- a/components/leveldb_proto/internal/unique_proto_database_unittest.cc
+++ b/components/leveldb_proto/internal/unique_proto_database_unittest.cc
@@ -224,33 +224,24 @@
   }
 }
 
-// RAII wrapper around `ProtoDatabaseImpl<TestProto>` that waits for posted
-// tasks to complete when destroyed.
-class ScopedProtoDatabase {
- public:
-  ScopedProtoDatabase()
-      : db_(std::make_unique<ProtoDatabaseImpl<TestProto>>(
-            ProtoDbType::TEST_DATABASE0,
-            base::FilePath(),
-            base::SingleThreadTaskRunner::GetCurrentDefault())) {}
-  ~ScopedProtoDatabase() {
-    db_.reset();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  ProtoDatabaseImpl<TestProto>* operator->() { return db_.get(); }
-
- private:
-  std::unique_ptr<ProtoDatabaseImpl<TestProto>> db_;
-};
-
 class UniqueProtoDatabaseTest : public testing::Test {
  public:
   UniqueProtoDatabaseTest()
       : options_(MakeMatcher(new OptionsEqMatcher(CreateSimpleOptions()))) {}
+  void SetUp() override {
+    db_ = std::make_unique<ProtoDatabaseImpl<TestProto>>(
+        ProtoDbType::TEST_DATABASE0, base::FilePath(),
+        base::SingleThreadTaskRunner::GetCurrentDefault());
+  }
+
+  void TearDown() override {
+    db_.reset();
+    base::RunLoop().RunUntilIdle();
+  }
 
   const Matcher<const Options&> options_;
   TaskEnvironment task_environment_;
+  std::unique_ptr<ProtoDatabaseImpl<TestProto>> db_;
 };
 
 // Test that UniqueProtoDatabase calls Init on the underlying database and that
@@ -265,10 +256,9 @@
   MockDatabaseCaller caller;
   EXPECT_CALL(caller, InitStatusCallback(Enums::InitStatus::kOK));
 
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   base::RunLoop().RunUntilIdle();
 }
@@ -286,10 +276,9 @@
   MockDatabaseCaller caller;
   EXPECT_CALL(caller, InitStatusCallback(Enums::InitStatus::kError));
 
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, options,
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, options,
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   base::RunLoop().RunUntilIdle();
 }
@@ -304,14 +293,13 @@
   MockDatabaseCaller caller;
   EXPECT_CALL(caller, InitStatusCallback(Enums::InitStatus::kOK));
 
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   EXPECT_CALL(caller, DestroyCallback(true));
-  db->Destroy(base::BindOnce(&MockDatabaseCaller::DestroyCallback,
-                             base::Unretained(&caller)));
+  db_->Destroy(base::BindOnce(&MockDatabaseCaller::DestroyCallback,
+                              base::Unretained(&caller)));
   EXPECT_CALL(*mock_db, Destroy()).WillOnce(Return(leveldb::Status()));
 
   base::RunLoop().RunUntilIdle();
@@ -327,14 +315,13 @@
   MockDatabaseCaller caller;
   EXPECT_CALL(caller, InitStatusCallback(Enums::InitStatus::kOK));
 
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   EXPECT_CALL(caller, DestroyCallback(false));
-  db->Destroy(base::BindOnce(&MockDatabaseCaller::DestroyCallback,
-                             base::Unretained(&caller)));
+  db_->Destroy(base::BindOnce(&MockDatabaseCaller::DestroyCallback,
+                              base::Unretained(&caller)));
   EXPECT_CALL(*mock_db, Destroy())
       .WillOnce(
           Return(leveldb::Status::IOError(leveldb::Slice(), leveldb::Slice())));
@@ -384,16 +371,15 @@
 
   EXPECT_CALL(*mock_db, Init(_, options_, _));
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   EXPECT_CALL(*mock_db, LoadKeysAndEntriesWhile(_, _, _, _))
       .WillOnce(AppendLoadKeysAndEntries(model));
   EXPECT_CALL(caller, LoadKeysAndEntriesCallback1(true, _))
       .WillOnce(VerifyLoadKeysAndEntries(testing::ByRef(model)));
-  db->LoadKeysAndEntries(
+  db_->LoadKeysAndEntries(
       base::BindOnce(&MockDatabaseCaller::LoadKeysAndEntriesCallback,
                      base::Unretained(&caller)));
 
@@ -408,15 +394,14 @@
 
   EXPECT_CALL(*mock_db, Init(_, options_, _));
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   EXPECT_CALL(*mock_db, LoadWithFilter(_, _, _, _)).WillOnce(Return(false));
   EXPECT_CALL(caller, LoadCallback1(false, _));
-  db->LoadEntries(base::BindOnce(&MockDatabaseCaller::LoadCallback,
-                                 base::Unretained(&caller)));
+  db_->LoadEntries(base::BindOnce(&MockDatabaseCaller::LoadCallback,
+                                  base::Unretained(&caller)));
 
   base::RunLoop().RunUntilIdle();
 }
@@ -434,11 +419,9 @@
   expected["d"] = model["d"];
 
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase proto_db;
-  proto_db->InitWithDatabase(
-      db.get(), temp_dir.GetPath(), CreateSimpleOptions(),
-      base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                     base::Unretained(&caller)));
+  db_->InitWithDatabase(db.get(), temp_dir.GetPath(), CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   auto save_entries =
       std::make_unique<ProtoDatabase<TestProto>::KeyEntryVector>();
@@ -450,14 +433,14 @@
 
   leveldb::Status status;
   EXPECT_CALL(caller, SaveCallback(true));
-  proto_db->UpdateEntries(std::move(save_entries), std::move(remove_keys),
-                          base::BindOnce(&MockDatabaseCaller::SaveCallback,
-                                         base::Unretained(&caller)));
+  db_->UpdateEntries(std::move(save_entries), std::move(remove_keys),
+                     base::BindOnce(&MockDatabaseCaller::SaveCallback,
+                                    base::Unretained(&caller)));
   base::RunLoop().RunUntilIdle();
 
   EXPECT_CALL(caller, LoadKeysAndEntriesCallback1(true, _))
       .WillOnce(VerifyLoadKeysAndEntries(testing::ByRef(expected)));
-  proto_db->LoadKeysAndEntriesInRange(
+  db_->LoadKeysAndEntriesInRange(
       "b", "d",
       base::BindOnce(&MockDatabaseCaller::LoadKeysAndEntriesCallback,
                      base::Unretained(&caller)));
@@ -477,11 +460,9 @@
   expected["d"] = model["d"];
 
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase proto_db;
-  proto_db->InitWithDatabase(
-      db.get(), temp_dir.GetPath(), CreateSimpleOptions(),
-      base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                     base::Unretained(&caller)));
+  db_->InitWithDatabase(db.get(), temp_dir.GetPath(), CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   auto save_entries =
       std::make_unique<ProtoDatabase<TestProto>::KeyEntryVector>();
@@ -494,14 +475,14 @@
 
   leveldb::Status status;
   EXPECT_CALL(caller, SaveCallback(true));
-  proto_db->UpdateEntries(std::move(save_entries), std::move(remove_keys),
-                          base::BindOnce(&MockDatabaseCaller::SaveCallback,
-                                         base::Unretained(&caller)));
+  db_->UpdateEntries(std::move(save_entries), std::move(remove_keys),
+                     base::BindOnce(&MockDatabaseCaller::SaveCallback,
+                                    base::Unretained(&caller)));
   base::RunLoop().RunUntilIdle();
 
   EXPECT_CALL(caller, LoadKeysAndEntriesCallback1(true, _))
       .WillOnce(VerifyLoadKeysAndEntries(testing::ByRef(expected)));
-  proto_db->LoadKeysAndEntriesInRange(
+  db_->LoadKeysAndEntriesInRange(
       "d", "d",
       base::BindOnce(&MockDatabaseCaller::LoadKeysAndEntriesCallback,
                      base::Unretained(&caller)));
@@ -537,18 +518,17 @@
 
   EXPECT_CALL(*mock_db, Init(_, options_, _));
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   std::string key("1");
   ASSERT_TRUE(model.count(key));
   EXPECT_CALL(*mock_db, Get(key, _, _, _)).WillOnce(SetGetEntry(model));
   EXPECT_CALL(caller, GetCallback1(true, _))
       .WillOnce(VerifyGetEntry(model[key]));
-  db->GetEntry(key, base::BindOnce(&MockDatabaseCaller::GetCallback,
-                                   base::Unretained(&caller)));
+  db_->GetEntry(key, base::BindOnce(&MockDatabaseCaller::GetCallback,
+                                    base::Unretained(&caller)));
 
   base::RunLoop().RunUntilIdle();
 }
@@ -564,10 +544,9 @@
   EXPECT_CALL(*mock_db, UpdateWithRemoveFilter(_, _, kTestPrefix, _))
       .WillOnce(Return(true));
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   base::RunLoop().RunUntilIdle();
 
@@ -578,7 +557,7 @@
         std::move(signal).Run();
       },
       run_update_entries.QuitClosure());
-  db->RemoveKeysForTesting(
+  db_->RemoveKeysForTesting(
       base::BindRepeating([](const std::string& str) { return true; }),
       kTestPrefix, std::move(expect_update_success));
   run_update_entries.Run();
@@ -653,17 +632,16 @@
 
   EXPECT_CALL(*mock_db, Init(_, options_, _));
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   std::string key("does_not_exist");
   ASSERT_FALSE(model.count(key));
   EXPECT_CALL(*mock_db, Get(key, _, _, _)).WillOnce(SetGetEntry(model));
   EXPECT_CALL(caller, GetCallback1(true, nullptr));
-  db->GetEntry(key, base::BindOnce(&MockDatabaseCaller::GetCallback,
-                                   base::Unretained(&caller)));
+  db_->GetEntry(key, base::BindOnce(&MockDatabaseCaller::GetCallback,
+                                    base::Unretained(&caller)));
 
   base::RunLoop().RunUntilIdle();
 }
@@ -677,17 +655,16 @@
 
   EXPECT_CALL(*mock_db, Init(_, options_, _));
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   std::string key("does_not_exist");
   ASSERT_FALSE(model.count(key));
   EXPECT_CALL(*mock_db, Get(key, _, _, _)).WillOnce(Return(false));
   EXPECT_CALL(caller, GetCallback1(false, nullptr));
-  db->GetEntry(key, base::BindOnce(&MockDatabaseCaller::GetCallback,
-                                   base::Unretained(&caller)));
+  db_->GetEntry(key, base::BindOnce(&MockDatabaseCaller::GetCallback,
+                                    base::Unretained(&caller)));
 
   base::RunLoop().RunUntilIdle();
 }
@@ -723,10 +700,9 @@
 
   EXPECT_CALL(*mock_db, Init(_, options_, _));
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   std::unique_ptr<ProtoDatabase<TestProto>::KeyEntryVector> entries(
       new ProtoDatabase<TestProto>::KeyEntryVector());
@@ -737,9 +713,9 @@
 
   EXPECT_CALL(*mock_db, Save(_, _, _)).WillOnce(VerifyUpdateEntries(model));
   EXPECT_CALL(caller, SaveCallback(true));
-  db->UpdateEntries(std::move(entries), std::move(keys_to_remove),
-                    base::BindOnce(&MockDatabaseCaller::SaveCallback,
-                                   base::Unretained(&caller)));
+  db_->UpdateEntries(std::move(entries), std::move(keys_to_remove),
+                     base::BindOnce(&MockDatabaseCaller::SaveCallback,
+                                    base::Unretained(&caller)));
 
   base::RunLoop().RunUntilIdle();
 }
@@ -755,16 +731,15 @@
 
   EXPECT_CALL(*mock_db, Init(_, options_, _));
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   EXPECT_CALL(*mock_db, Save(_, _, _)).WillOnce(Return(false));
   EXPECT_CALL(caller, SaveCallback(false));
-  db->UpdateEntries(std::move(entries), std::move(keys_to_remove),
-                    base::BindOnce(&MockDatabaseCaller::SaveCallback,
-                                   base::Unretained(&caller)));
+  db_->UpdateEntries(std::move(entries), std::move(keys_to_remove),
+                     base::BindOnce(&MockDatabaseCaller::SaveCallback,
+                                    base::Unretained(&caller)));
 
   base::RunLoop().RunUntilIdle();
 }
@@ -781,10 +756,9 @@
 
   EXPECT_CALL(*mock_db, Init(_, options_, _));
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   std::unique_ptr<ProtoDatabase<TestProto>::KeyEntryVector> entries(
       new ProtoDatabase<TestProto>::KeyEntryVector());
@@ -795,9 +769,9 @@
   KeyVector keys_copy(*keys_to_remove.get());
   EXPECT_CALL(*mock_db, Save(_, keys_copy, _)).WillOnce(Return(true));
   EXPECT_CALL(caller, SaveCallback(true));
-  db->UpdateEntries(std::move(entries), std::move(keys_to_remove),
-                    base::BindOnce(&MockDatabaseCaller::SaveCallback,
-                                   base::Unretained(&caller)));
+  db_->UpdateEntries(std::move(entries), std::move(keys_to_remove),
+                     base::BindOnce(&MockDatabaseCaller::SaveCallback,
+                                    base::Unretained(&caller)));
 
   base::RunLoop().RunUntilIdle();
 }
@@ -813,16 +787,15 @@
 
   EXPECT_CALL(*mock_db, Init(_, options_, _));
   EXPECT_CALL(caller, InitStatusCallback(_));
-  ScopedProtoDatabase db;
-  db->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
-                       base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
-                                      base::Unretained(&caller)));
+  db_->InitWithDatabase(mock_db.get(), path, CreateSimpleOptions(),
+                        base::BindOnce(&MockDatabaseCaller::InitStatusCallback,
+                                       base::Unretained(&caller)));
 
   EXPECT_CALL(*mock_db, Save(_, _, _)).WillOnce(Return(false));
   EXPECT_CALL(caller, SaveCallback(false));
-  db->UpdateEntries(std::move(entries), std::move(keys_to_remove),
-                    base::BindOnce(&MockDatabaseCaller::SaveCallback,
-                                   base::Unretained(&caller)));
+  db_->UpdateEntries(std::move(entries), std::move(keys_to_remove),
+                     base::BindOnce(&MockDatabaseCaller::SaveCallback,
+                                    base::Unretained(&caller)));
 
   base::RunLoop().RunUntilIdle();
 }
diff --git a/components/metrics/BUILD.gn b/components/metrics/BUILD.gn
index 29c88b0d..74e7ce86 100644
--- a/components/metrics/BUILD.gn
+++ b/components/metrics/BUILD.gn
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/chromeos/ui_mode.gni")
 import("//build/config/cronet/config.gni")
 import("//build/config/features.gni")
 import("//testing/test.gni")
@@ -254,7 +253,6 @@
       "//base:base_static",
       "//base:i18n",
       "//build:branding_buildflags",
-      "//build:chromeos_buildflags",
       "//components/flags_ui:switches",
       "//components/metrics/public/mojom:call_stack_mojo_bindings",
       "//components/metrics/public/mojom:histogram_fetcher_mojo_bindings",
@@ -428,7 +426,6 @@
 
     deps = [
       "//base",
-      "//build:chromeos_buildflags",
       "//components/encrypted_messages:encrypted_message_proto",
       "//components/encrypted_messages:encrypted_messages",
       "//components/variations",
@@ -606,7 +603,6 @@
       "//base:base_stack_sampling_profiler_test_util",
       "//base/test:test_support",
       "//build:branding_buildflags",
-      "//build:chromeos_buildflags",
       "//components/component_updater:test_support",
       "//components/encrypted_messages:encrypted_message_proto",
       "//components/metrics/public/mojom:call_stack_mojo_bindings",
@@ -651,11 +647,8 @@
     if (is_chromeos) {
       sources += [ "call_stacks/stack_sampling_recorder_unittest.cc" ]
 
-      deps += [ ":system_stack_sampled_metrics_status_proto" ]
-    }
-
-    if (is_chromeos_ash) {
       deps += [
+        ":system_stack_sampled_metrics_status_proto",
         "//chromeos/ash/components/dbus:test_support",
         "//chromeos/ash/components/network:test_support",
       ]
diff --git a/components/metrics/call_stacks/stack_sampling_recorder.cc b/components/metrics/call_stacks/stack_sampling_recorder.cc
index f6917d7..ff98a23 100644
--- a/components/metrics/call_stacks/stack_sampling_recorder.cc
+++ b/components/metrics/call_stacks/stack_sampling_recorder.cc
@@ -17,7 +17,6 @@
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "base/time/time.h"
-#include "build/chromeos_buildflags.h"
 #include "components/metrics/call_stacks/call_stack_profile_metrics_provider.h"
 #include "third_party/cros_system_api/proto/stack_sampled_metrics_status/stack_sampled_metrics_status.pb.h"
 
@@ -26,11 +25,7 @@
 namespace {
 // The path to write to. Deliberately not using base::GetTempDir() here;
 // the tast test needs to known the complete, exact path.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-constexpr char kDefaultFilePath[] = "/tmp/stack-sampling-data-lacros";
-#else
 constexpr char kDefaultFilePath[] = "/tmp/stack-sampling-data";
-#endif
 
 // Time between writes. This is very short because we are only using this as
 // part of an integration test and the test doesn't want to have a large
diff --git a/components/metrics/call_stacks/stack_sampling_recorder.h b/components/metrics/call_stacks/stack_sampling_recorder.h
index f9f3d3c..fe802cb9 100644
--- a/components/metrics/call_stacks/stack_sampling_recorder.h
+++ b/components/metrics/call_stacks/stack_sampling_recorder.h
@@ -11,19 +11,16 @@
 
 namespace metrics {
 
-// Instructs Chrome to record /tmp/stack-sampling-data (or
-// /tmp/stack-sampling-data-lacros) with details of which threads and processes
-// are being successfully stack-sampled.
+// Instructs Chrome to record /tmp/stack-sampling-data with details of which
+// threads and processes are being successfully stack-sampled.
 inline constexpr char kRecordStackSamplingDataSwitch[] =
     "record-stack-sampling-data";
 
-// Regularly writes a file (default: /tmp/stack-sampling-data or
-// /tmp/stack-sampling-data-lacros) listing which threads and processes have
-// been successfully stack sampled.
+// Regularly writes a file (default: /tmp/stack-sampling-data) listing which
+// threads and processes have been successfully stack sampled.
 //
-// Used by a few ChromeOS tast tests (for both ash and Lacros). Not created
-// during normal operations. Creation is controlled by
-// kRecordStackSamplingDataSwitch.
+// Used by a few ChromeOS tast tests. Not created during normal operations.
+// Creation is controlled by kRecordStackSamplingDataSwitch.
 class StackSamplingRecorder
     : public base::RefCountedThreadSafe<StackSamplingRecorder> {
  public:
diff --git a/components/metrics/debug/structured/structured_metrics_utils.cc b/components/metrics/debug/structured/structured_metrics_utils.cc
index 8ed8e738..f91038591 100644
--- a/components/metrics/debug/structured/structured_metrics_utils.cc
+++ b/components/metrics/debug/structured/structured_metrics_utils.cc
@@ -12,13 +12,13 @@
 base::Value GetStructuredMetricsSummary(StructuredMetricsService* service) {
   base::Value::Dict result = base::Value::Dict().Set("enabled", false);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   result.Set("crosDeviceId", "-");
 #endif
 
   if (service && service->recording_enabled()) {
     result.Set("enabled", true);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     auto id =
         service->recorder()->key_data_provider()->GetSecondaryId("CrOSEvents");
     if (id.has_value()) {
diff --git a/components/metrics/demographics/BUILD.gn b/components/metrics/demographics/BUILD.gn
index 9e53edb..609ead2d 100644
--- a/components/metrics/demographics/BUILD.gn
+++ b/components/metrics/demographics/BUILD.gn
@@ -16,7 +16,6 @@
 
   deps = [
     "//base",
-    "//build:chromeos_buildflags",
     "//components/metrics",
     "//components/pref_registry",
     "//components/prefs",
@@ -35,7 +34,6 @@
     ":demographics",
     "//base",
     "//base/test:test_support",
-    "//build:chromeos_buildflags",
     "//components/metrics",
     "//components/sync:test_support",
     "//components/sync/base",
diff --git a/components/metrics/demographics/demographic_metrics_provider.cc b/components/metrics/demographics/demographic_metrics_provider.cc
index 803013c2..ff26350 100644
--- a/components/metrics/demographics/demographic_metrics_provider.cc
+++ b/components/metrics/demographics/demographic_metrics_provider.cc
@@ -9,7 +9,6 @@
 #include "base/feature_list.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
-#include "build/chromeos_buildflags.h"
 #include "components/sync/base/features.h"
 #include "components/sync/service/sync_service.h"
 #include "components/sync/service/sync_service_utils.h"
@@ -87,7 +86,7 @@
   if (!base::FeatureList::IsEnabled(kDemographicMetricsReporting))
     return std::nullopt;
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Skip if not exactly one Profile on disk. Having more than one Profile that
   // is using the browser can make demographics less relevant. This approach
   // cannot determine if there is more than 1 distinct user using the Profile.
@@ -95,15 +94,12 @@
   // ChromeOS almost always has more than one profile on disk, so this check
   // doesn't work. We have a profile selection strategy for ChromeOS, so skip
   // this check for ChromeOS.
-  // TODO(crbug.com/40729596): LaCros will behave similarly to desktop Chrome
-  // and reduce the number of profiles on disk to one, so remove these #if
-  // guards after LaCros release.
   if (profile_client_->GetNumberOfProfilesOnDisk() != 1) {
     LogUserDemographicsStatusInHistogram(
         UserDemographicsStatus::kMoreThanOneProfile);
     return std::nullopt;
   }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
   syncer::SyncService* sync_service = profile_client_->GetSyncService();
   // Skip if no sync service.
diff --git a/components/metrics/demographics/demographic_metrics_provider_unittest.cc b/components/metrics/demographics/demographic_metrics_provider_unittest.cc
index c8daf17..b6d2e45d 100644
--- a/components/metrics/demographics/demographic_metrics_provider_unittest.cc
+++ b/components/metrics/demographics/demographic_metrics_provider_unittest.cc
@@ -11,7 +11,6 @@
 #include "base/test/simple_test_clock.h"
 #include "base/time/time.h"
 #include "base/values.h"
-#include "build/chromeos_buildflags.h"
 #include "components/metrics/demographics/user_demographics.h"
 #include "components/metrics/metrics_log_uploader.h"
 #include "components/sync/base/features.h"
@@ -36,12 +35,12 @@
   SYNC_FEATURE_ENABLED,
   SYNC_FEATURE_ENABLED_BUT_PAUSED,
   SYNC_FEATURE_DISABLED_BUT_PREFERENCES_ENABLED,
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Represents the user clearing sync data via dashboard. On all platforms
-  // except ChromeOS (Ash), this clears the primary account (which is basically
-  // SYNC_FEATURE_NOT_ENABLED). On ChromeOS Ash, Sync enters a special state.
-  SYNC_FEATURE_DISABLED_ON_CHROMEOS_ASH_VIA_DASHBOARD,
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+  // except ChromeOS, this clears the primary account (which is basically
+  // SYNC_FEATURE_NOT_ENABLED). On ChromeOS, Sync enters a special state.
+  SYNC_FEATURE_DISABLED_ON_CHROMEOS_VIA_DASHBOARD,
+#endif  // BUILDFLAG(IS_CHROMEOS)
 };
 
 // Profile client for testing that gets fake Profile information and services.
@@ -99,8 +98,8 @@
                  sync_service_->GetTransportState());
         break;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-      case SYNC_FEATURE_DISABLED_ON_CHROMEOS_ASH_VIA_DASHBOARD:
+#if BUILDFLAG(IS_CHROMEOS)
+      case SYNC_FEATURE_DISABLED_ON_CHROMEOS_VIA_DASHBOARD:
         sync_service_ = std::make_unique<syncer::TestSyncService>();
         sync_service_->GetUserSettings()->SetSyncFeatureDisabledViaDashboard(
             true);
@@ -112,7 +111,7 @@
                   ->IsInitialSyncFeatureSetupComplete());
         CHECK(!sync_service_->IsSyncFeatureEnabled());
         break;
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
     }
   }
 
@@ -286,7 +285,7 @@
                                UserDemographicsStatus::kSyncNotEnabled, 1);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST(
     DemographicMetricsProviderTest,
     ProvideSyncedUserNoisedBirthYearAndGender_SyncFeatureDisabledOnChromeOsAshViaSyncDashboard) {
@@ -294,7 +293,7 @@
 
   auto client = std::make_unique<TestProfileClient>(
       /*number_of_profiles=*/1,
-      SYNC_FEATURE_DISABLED_ON_CHROMEOS_ASH_VIA_DASHBOARD);
+      SYNC_FEATURE_DISABLED_ON_CHROMEOS_VIA_DASHBOARD);
 
   // Run demographics provider.
   DemographicMetricsProvider provider(
@@ -310,7 +309,7 @@
   histogram.ExpectUniqueSample("UMA.UserDemographics.Status",
                                UserDemographicsStatus::kSyncNotEnabled, 1);
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 TEST(DemographicMetricsProviderTest,
      ProvideSyncedUserNoisedBirthYearAndGender_SyncNotEnabled) {
@@ -374,7 +373,7 @@
   ChromeUserMetricsExtension uma_proto;
   provider.ProvideSyncedUserNoisedBirthYearAndGender(&uma_proto);
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Expect that the UMA proto is untouched.
   EXPECT_FALSE(uma_proto.user_demographics().has_birth_year());
   EXPECT_FALSE(uma_proto.user_demographics().has_gender());
@@ -391,7 +390,7 @@
   // Verify histograms.
   histogram.ExpectUniqueSample("UMA.UserDemographics.Status",
                                UserDemographicsStatus::kSuccess, 1);
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 }
 
 TEST(DemographicMetricsProviderTest,
diff --git a/components/metrics/demographics/user_demographics.cc b/components/metrics/demographics/user_demographics.cc
index 21d093e..5736ee5 100644
--- a/components/metrics/demographics/user_demographics.cc
+++ b/components/metrics/demographics/user_demographics.cc
@@ -16,7 +16,7 @@
 
 namespace metrics {
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 constexpr auto kSyncDemographicsPrefFlags =
     user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF;
 #else
@@ -37,7 +37,7 @@
 namespace {
 
 const base::Value::Dict& GetDemographicsDict(PrefService* profile_prefs) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // TODO(crbug.com/40240008): On Ash only, clear sync demographics pref once
   // os-level syncable pref is fully rolled out and Ash drops support for
   // non-os-level syncable prefs.
@@ -193,7 +193,7 @@
 }
 
 void RegisterDemographicsProfilePrefs(PrefRegistrySimple* registry) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   registry->RegisterDictionaryPref(kSyncOsDemographicsPrefName,
                                    kSyncOsDemographicsPrefFlags);
 #endif
@@ -214,7 +214,7 @@
   // to change for a given user + client id, then the min/max noisy birth year
   // values could both be reported, revealing the true value in the middle.
   profile_prefs->ClearPref(kSyncDemographicsPrefName);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   profile_prefs->ClearPref(kSyncOsDemographicsPrefName);
 #endif
 }
diff --git a/components/metrics/demographics/user_demographics.h b/components/metrics/demographics/user_demographics.h
index 86b4d53..5195fc3d 100644
--- a/components/metrics/demographics/user_demographics.h
+++ b/components/metrics/demographics/user_demographics.h
@@ -44,7 +44,7 @@
 // provided by the sync server. This is a read-only syncable priority pref on
 // all platforms except ChromeOS Ash, where it is a syncable OS-level priority
 // pref.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 inline constexpr char kSyncDemographicsPrefName[] = "sync.demographics";
 #else
 inline constexpr char kSyncOsDemographicsPrefName[] = "sync.os_demographics";
diff --git a/components/metrics/demographics/user_demographics_unittest.cc b/components/metrics/demographics/user_demographics_unittest.cc
index 0e1a3d15..f6a9fd4 100644
--- a/components/metrics/demographics/user_demographics_unittest.cc
+++ b/components/metrics/demographics/user_demographics_unittest.cc
@@ -66,7 +66,7 @@
     SetDemographicsImpl(kSyncDemographicsPrefName, birth_year, gender);
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   void SetOsDemographics(int birth_year, UserDemographicsProto::Gender gender) {
     SetDemographicsImpl(kSyncOsDemographicsPrefName, birth_year, gender);
   }
@@ -123,7 +123,7 @@
   }
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(UserDemographicsPrefsTest, ReadOsDemographicsWithRandomOffset) {
   int user_demographics_birth_year = 1983;
   UserDemographicsProto_Gender user_demographics_gender =
@@ -158,7 +158,7 @@
     EXPECT_EQ(provided_birth_year, demographics_result.value().birth_year);
   }
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 TEST_F(UserDemographicsPrefsTest, ReadAndClearUserDemographicPreferences) {
   // Verify demographic prefs are not available when there is nothing set.
@@ -193,7 +193,7 @@
                    GetNowTime(), GetLocalState(), GetProfilePrefs())
                    .IsSuccess());
   EXPECT_FALSE(GetProfilePrefs()->HasPrefPath(kSyncDemographicsPrefName));
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   EXPECT_FALSE(GetProfilePrefs()->HasPrefPath(kSyncOsDemographicsPrefName));
 #endif
   EXPECT_TRUE(
@@ -234,7 +234,7 @@
       kDeprecatedDemographicsBirthYearOffsetPrefName));
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(UserDemographicsPrefsTest, ChromeOsAsh) {
   // Verify demographic prefs are not available when there is nothing set.
   ASSERT_FALSE(GetUserNoisedBirthYearAndGenderFromPrefs(
@@ -260,7 +260,7 @@
   EXPECT_TRUE(
       GetLocalState()->HasPrefPath(kUserDemographicsBirthYearOffsetPrefName));
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 struct DemographicsTestParam {
   // Birth year of the user.
diff --git a/components/metrics/dwa/dwa_service.cc b/components/metrics/dwa/dwa_service.cc
index 60aa5b5..bff766f1 100644
--- a/components/metrics/dwa/dwa_service.cc
+++ b/components/metrics/dwa/dwa_service.cc
@@ -169,7 +169,7 @@
   coarse_system_info->set_platform(::dwa::CoarseSystemInfo::PLATFORM_ANDROID);
 #elif BUILDFLAG(IS_IOS)
   coarse_system_info->set_platform(::dwa::CoarseSystemInfo::PLATFORM_IOS);
-#elif BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#elif BUILDFLAG(IS_CHROMEOS)
   coarse_system_info->set_platform(::dwa::CoarseSystemInfo::PLATFORM_CHROMEOS);
 #else
   coarse_system_info->set_platform(::dwa::CoarseSystemInfo::PLATFORM_OTHER);
diff --git a/components/metrics/entropy_state.cc b/components/metrics/entropy_state.cc
index 04fa1ff..ea87b57 100644
--- a/components/metrics/entropy_state.cc
+++ b/components/metrics/entropy_state.cc
@@ -24,13 +24,6 @@
 
 namespace {
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-// Needed for a check to see if we retrieved entropy values before we have
-// transferred them from Ash.
-bool g_entropy_source_has_been_retrieved = false;
-bool g_entropy_source_has_been_set = false;
-#endif
-
 // Generates a new non-identifying entropy source used to seed persistent
 // activities. Make it static so that the new low entropy source value will
 // only be generated on first access. And thus, even though we may write the
@@ -76,17 +69,10 @@
 
 // static
 void EntropyState::ClearPrefs(PrefService* local_state) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // There are currently multiple EntropyState objects (crbug/1495576) and as
-  // Lacros does not own the entropy values anyways, it shouldn't clear them
-  // either.
-  LOG(WARNING) << "EntropyState::ClearPrefs ignored as set remotely.";
-#else
   local_state->ClearPref(prefs::kMetricsLowEntropySource);
   local_state->ClearPref(prefs::kMetricsOldLowEntropySource);
   local_state->ClearPref(prefs::kMetricsPseudoLowEntropySource);
   local_state->ClearPref(prefs::kMetricsLimitedEntropyRandomizationSource);
-#endif
 }
 
 // static
@@ -101,39 +87,6 @@
                                std::string());
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-// static
-void EntropyState::SetExternalPrefs(
-    PrefService* local_state,
-    int low_entropy_source,
-    int old_low_entropy_source,
-    int pseudo_low_entropy_source,
-    std::string_view limited_entropy_randomization_source) {
-  if (!g_entropy_source_has_been_set) {
-    g_entropy_source_has_been_set = true;
-    // As an |EntropyState| object has an internal state, we need to make sure
-    // that none gets read before the Ash values have been transferred.
-    // This is usually taken care of by
-    // `ChromeMetricsServicesManagerClient::GetMetricsStateManager` which first
-    // sets the Ash values and then creates the `MetricsStateManager`.
-    if (g_entropy_source_has_been_retrieved) {
-      LOG(ERROR) << "Entropy value was retrieved before they were updated";
-    }
-    DCHECK(!g_entropy_source_has_been_retrieved);
-  }
-  local_state->SetInteger(prefs::kMetricsLowEntropySource, low_entropy_source);
-  local_state->SetInteger(prefs::kMetricsOldLowEntropySource,
-                          old_low_entropy_source);
-  local_state->SetInteger(prefs::kMetricsPseudoLowEntropySource,
-                          pseudo_low_entropy_source);
-  if (IsValidLimitedEntropyRandomizationSource(
-          limited_entropy_randomization_source)) {
-    local_state->SetString(prefs::kMetricsLimitedEntropyRandomizationSource,
-                           limited_entropy_randomization_source);
-  }
-}
-#endif
-
 std::string EntropyState::GetHighEntropySource(
     const std::string& initial_client_id) {
   DCHECK(!initial_client_id.empty());
@@ -216,10 +169,6 @@
 }
 
 void EntropyState::UpdateLowEntropySources() {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // Coming here, someone was reading an entropy value.
-  g_entropy_source_has_been_retrieved = true;
-#endif
   // The default value for |low_entropy_source_| and the default pref value are
   // both |kLowEntropySourceNotSet|, which indicates the value has not been set.
   if (low_entropy_source_ != kLowEntropySourceNotSet &&
diff --git a/components/metrics/entropy_state.h b/components/metrics/entropy_state.h
index 2dd1490..9a86883 100644
--- a/components/metrics/entropy_state.h
+++ b/components/metrics/entropy_state.h
@@ -31,19 +31,6 @@
   // Registers low_entropy_source and old_low_entropy_source in the prefs.
   static void RegisterPrefs(PrefRegistrySimple* registry);
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // Overriding the entropy source preferences with new values as given by
-  // Ash upon initialization, before the MetricsService gets created.
-  // |limited_entropy_randomization_source| will only be overridden if it's
-  // valid. See IsValidLimitedEntropyRandomizationSource().
-  static void SetExternalPrefs(
-      PrefService* local_state,
-      int low_entropy_source,
-      int old_low_entropy_source,
-      int pseudo_low_entropy_source,
-      std::string_view limited_entropy_randomization_source);
-#endif
-
   // Returns the high entropy source for this client, which is composed of a
   // client ID and the low entropy source. This is intended to be unique for
   // each install. |initial_client_id| is the client_id that was used to
diff --git a/components/metrics/entropy_state_unittest.cc b/components/metrics/entropy_state_unittest.cc
index b6eed65..6b2c92bc 100644
--- a/components/metrics/entropy_state_unittest.cc
+++ b/components/metrics/entropy_state_unittest.cc
@@ -168,53 +168,6 @@
   }
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-TEST_F(EntropyStateTest, ClearPrefs) {
-  // On Lacros we expect that there will be no clearing of prefs.
-  prefs_.SetInteger(prefs::kMetricsLowEntropySource, 1234);
-  prefs_.SetInteger(prefs::kMetricsOldLowEntropySource, 5678);
-  prefs_.SetInteger(prefs::kMetricsPseudoLowEntropySource, 4321);
-  prefs_.SetString(prefs::kMetricsLimitedEntropyRandomizationSource,
-                   "00000000000000000000000000000001");
-
-  EntropyState::ClearPrefs(&prefs_);
-
-  EXPECT_TRUE(prefs_.HasPrefPath(prefs::kMetricsLowEntropySource));
-  EXPECT_TRUE(prefs_.HasPrefPath(prefs::kMetricsOldLowEntropySource));
-  EXPECT_TRUE(prefs_.HasPrefPath(prefs::kMetricsPseudoLowEntropySource));
-  EXPECT_TRUE(
-      prefs_.HasPrefPath(prefs::kMetricsLimitedEntropyRandomizationSource));
-}
-
-TEST_F(EntropyStateTest, SetExternalPrefs) {
-  prefs_.ClearPref(prefs::kMetricsLowEntropySource);
-  prefs_.ClearPref(prefs::kMetricsOldLowEntropySource);
-  prefs_.ClearPref(prefs::kMetricsPseudoLowEntropySource);
-  prefs_.ClearPref(prefs::kMetricsLimitedEntropyRandomizationSource);
-
-  std::string limited_entropy_randomization_source =
-      "00000000000000000000000000000001";
-  EntropyState::SetExternalPrefs(&prefs_, 1234, 4567, 3456,
-                                 limited_entropy_randomization_source);
-
-  EXPECT_EQ(prefs_.GetInteger(prefs::kMetricsLowEntropySource), 1234);
-  EXPECT_EQ(prefs_.GetInteger(prefs::kMetricsOldLowEntropySource), 4567);
-  EXPECT_EQ(prefs_.GetInteger(prefs::kMetricsPseudoLowEntropySource), 3456);
-  EXPECT_EQ(prefs_.GetString(prefs::kMetricsLimitedEntropyRandomizationSource),
-            limited_entropy_randomization_source);
-}
-
-TEST_F(EntropyStateTest, SetEmptyStringToLimitedEntropyRandomizationSource) {
-  prefs_.ClearPref(prefs::kMetricsLimitedEntropyRandomizationSource);
-
-  EntropyState::SetExternalPrefs(&prefs_, 1234, 4567, 3456, std::string_view());
-
-  EXPECT_FALSE(
-      prefs_.HasPrefPath(prefs::kMetricsLimitedEntropyRandomizationSource));
-}
-
-#else
-
 TEST_F(EntropyStateTest, ClearPrefs) {
   prefs_.SetInteger(prefs::kMetricsLowEntropySource, 1234);
   prefs_.SetInteger(prefs::kMetricsOldLowEntropySource, 5678);
@@ -230,7 +183,6 @@
   EXPECT_FALSE(
       prefs_.HasPrefPath(prefs::kMetricsLimitedEntropyRandomizationSource));
 }
-#endif
 
 TEST_F(EntropyStateTest, ClearingPrefWillNotResetValuesDuringSession) {
   // Setting test values in prefs;
diff --git a/components/metrics/metrics_log.cc b/components/metrics/metrics_log.cc
index 1450f7a..5c812845 100644
--- a/components/metrics/metrics_log.cc
+++ b/components/metrics/metrics_log.cc
@@ -33,7 +33,6 @@
 #include "base/time/default_clock.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/flags_ui/flags_ui_switches.h"
 #include "components/metrics/delegating_provider.h"
 #include "components/metrics/environment_recorder.h"
@@ -403,11 +402,7 @@
 #endif
 
   metrics::SystemProfileProto::OS* os = system_profile->mutable_os();
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // The Lacros browser runs on Chrome OS, but reports a special OS name to
-  // differentiate itself from the built-in ash browser + window manager binary.
-  os->set_name("Lacros");
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   os->set_name("CrOS");
 #else
   os->set_name(base::SysInfo::OperatingSystemName());
@@ -416,9 +411,9 @@
 
 // On ChromeOS, KernelVersion refers to the Linux kernel version and
 // OperatingSystemVersion refers to the ChromeOS release version.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   os->set_kernel_version(base::SysInfo::KernelVersion());
-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#elif BUILDFLAG(IS_LINUX)
   // Linux operating system version is copied over into kernel version to be
   // consistent.
   os->set_kernel_version(base::SysInfo::OperatingSystemVersion());
@@ -640,12 +635,12 @@
   }
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void MetricsLog::SetUserId(const std::string& user_id) {
   uint64_t hashed_user_id = Hash(user_id);
   uma_proto_.set_user_id(hashed_user_id);
   log_metadata_.user_id = hashed_user_id;
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace metrics
diff --git a/components/metrics/metrics_log.h b/components/metrics/metrics_log.h
index c0f1964..3e02f50 100644
--- a/components/metrics/metrics_log.h
+++ b/components/metrics/metrics_log.h
@@ -19,7 +19,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_base.h"
 #include "base/time/time.h"
-#include "build/chromeos_buildflags.h"
 #include "components/metrics/metrics_reporting_default_state.h"
 #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"
 #include "third_party/metrics_proto/system_profile.pb.h"
@@ -208,7 +207,7 @@
       std::optional<ChromeUserMetricsExtension::RealLocalTime> close_time,
       std::string* encoded_log);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Assigns a user ID to the log. This should be called immediately after
   // consotruction if it should be applied.
   void SetUserId(const std::string& user_id);
diff --git a/components/metrics/metrics_log_unittest.cc b/components/metrics/metrics_log_unittest.cc
index 0b03f70..212b1cf2 100644
--- a/components/metrics/metrics_log_unittest.cc
+++ b/components/metrics/metrics_log_unittest.cc
@@ -25,7 +25,6 @@
 #include "base/time/default_tick_clock.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/metrics/cpu_metrics_provider.h"
 #include "components/metrics/delegating_provider.h"
 #include "components/metrics/environment_recorder.h"
@@ -88,7 +87,7 @@
 
 // Returns the expected hardware class for a metrics log.
 std::string GetExpectedHardwareClass() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Currently, we are relying on base/ implementation for functionality on our
   // side which can be fragile if in the future someone decides to change that.
   // This replicates the logic to get the hardware class for ChromeOS and this
@@ -298,19 +297,17 @@
   hardware->set_dll_base(reinterpret_cast<uint64_t>(CURRENT_MODULE()));
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  system_profile->mutable_os()->set_name("Lacros");
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   system_profile->mutable_os()->set_name("CrOS");
 #else
   system_profile->mutable_os()->set_name(base::SysInfo::OperatingSystemName());
 #endif
   system_profile->mutable_os()->set_version(
       base::SysInfo::OperatingSystemVersion());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   system_profile->mutable_os()->set_kernel_version(
       base::SysInfo::KernelVersion());
-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#elif BUILDFLAG(IS_LINUX)
   system_profile->mutable_os()->set_kernel_version(
       base::SysInfo::OperatingSystemVersion());
 #elif BUILDFLAG(IS_ANDROID)
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc
index 0c1bf93..c5b6c61 100644
--- a/components/metrics/metrics_service.cc
+++ b/components/metrics/metrics_service.cc
@@ -149,7 +149,6 @@
 #include "base/time/time.h"
 #include "base/trace_event/named_trigger.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/metrics/clean_exit_beacon.h"
 #include "components/metrics/environment_recorder.h"
 #include "components/metrics/field_trials_provider.h"
@@ -295,7 +294,7 @@
 // The browser last live timestamp is updated every 15 minutes.
 const int kUpdateAliveTimestampSeconds = 15 * 60;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 enum UserLogStoreState {
   kSetPostSendLogsState = 0,
   kSetPreSendLogsState = 1,
@@ -307,7 +306,7 @@
 void RecordUserLogStoreState(UserLogStoreState state) {
   base::UmaHistogramEnumeration("UMA.CrosPerUser.UserLogStoreState", state);
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace
 
@@ -669,7 +668,7 @@
       &snapshot_manager);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void MetricsService::SetUserLogStore(
     std::unique_ptr<UnsentLogStore> user_log_store) {
   if (log_store()->has_alternate_ongoing_log_store())
@@ -754,9 +753,7 @@
     bool user_metrics_consent) {
   client_->UpdateCurrentUserMetricsConsent(user_metrics_consent);
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
-#if BUILDFLAG(IS_CHROMEOS)
 void MetricsService::ResetClientId() {
   // Pref must be cleared in order for ForceClientIdCreation to generate a new
   // client ID.
@@ -1421,11 +1418,11 @@
       state_manager_->client_id(), session_id_, log_type, client_);
   new_metrics_log->AssignRecordId(local_state_);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   std::optional<std::string> user_id = GetCurrentUserId();
   if (user_id.has_value())
     new_metrics_log->SetUserId(user_id.value());
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   return new_metrics_log;
 }
diff --git a/components/metrics/metrics_service.h b/components/metrics/metrics_service.h
index 38968e6..d8a6622 100644
--- a/components/metrics/metrics_service.h
+++ b/components/metrics/metrics_service.h
@@ -30,7 +30,6 @@
 #include "base/sequence_checker.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/metrics/delegating_provider.h"
 #include "components/metrics/metrics_log.h"
 #include "components/metrics/metrics_log_store.h"
@@ -177,7 +176,7 @@
   // be included in the next log.
   void MarkCurrentHistogramsAsReported();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Binds a user log store to store unsent logs. This log store will be
   // fully managed by MetricsLogStore. This will no-op if another log store has
   // already been set.
@@ -227,9 +226,7 @@
 
   // Updates the current user metrics consent. No-ops if no user has logged in.
   void UpdateCurrentUserMetricsConsent(bool user_metrics_consent);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
-#if BUILDFLAG(IS_CHROMEOS)
   // Forces the client ID to be reset and generates a new client ID. This will
   // be called when a user re-consents to metrics collection and the user had
   // consented in the past.
diff --git a/components/metrics/metrics_service_unittest.cc b/components/metrics/metrics_service_unittest.cc
index a7b31215..d6ed3913f 100644
--- a/components/metrics/metrics_service_unittest.cc
+++ b/components/metrics/metrics_service_unittest.cc
@@ -1426,28 +1426,7 @@
   EXPECT_FALSE(test_log_store->has_unsent_logs());
 }
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-// ResetClientId is only enabled on certain targets.
-TEST_F(MetricsServiceTest, SetClientIdToExternalId) {
-  EnableMetricsReporting();
-  TestMetricsServiceClient client;
-  TestMetricsService service(GetMetricsStateManager(), &client,
-                             GetLocalState());
-
-  const std::string client_id = "d92ad666-a420-4c73-8718-94311ae2ff5f";
-
-  EXPECT_NE(service.GetClientId(), client_id);
-
-  service.SetExternalClientId(client_id);
-  // Reset will cause the client id to be regenerated. If an external client id
-  // is provided, it should defer to using that id instead of creating its own.
-  service.ResetClientId();
-
-  EXPECT_EQ(service.GetClientId(), client_id);
-}
-#endif  //  BUILDFLAG(IS_CHROMEOS_LACROS)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(MetricsServiceTest,
        OngoingLogNotFlushedBeforeInitialLogWhenUserLogStoreSet) {
   EnableMetricsReporting();
@@ -1607,6 +1586,6 @@
   base::RecordAction(base::UserMetricsAction("TestAction"));
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace metrics
diff --git a/components/metrics/metrics_state_manager.cc b/components/metrics/metrics_state_manager.cc
index 83f3dbe..baaf7011 100644
--- a/components/metrics/metrics_state_manager.cc
+++ b/components/metrics/metrics_state_manager.cc
@@ -436,9 +436,9 @@
     local_state_->SetString(prefs::kMetricsClientID, client_id_);
     return;
   }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   std::string previous_client_id = client_id_;
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   {
     std::string client_id_from_prefs = ReadClientId(local_state_);
     // If client id in prefs matches the cached copy, return early.
diff --git a/components/metrics/metrics_state_manager.h b/components/metrics/metrics_state_manager.h
index 4ab5bdb..be2e099 100644
--- a/components/metrics/metrics_state_manager.h
+++ b/components/metrics/metrics_state_manager.h
@@ -15,7 +15,6 @@
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/field_trial.h"
-#include "build/chromeos_buildflags.h"
 #include "components/metrics/clean_exit_beacon.h"
 #include "components/metrics/client_info.h"
 #include "components/metrics/cloned_install_detector.h"
diff --git a/components/metrics/net/cellular_logic_helper.cc b/components/metrics/net/cellular_logic_helper.cc
index dfccbb8..4a22fa19 100644
--- a/components/metrics/net/cellular_logic_helper.cc
+++ b/components/metrics/net/cellular_logic_helper.cc
@@ -7,7 +7,6 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/metrics/metrics_features.h"
 #include "net/base/network_change_notifier.h"
 
diff --git a/components/metrics/net/network_metrics_provider_unittest.cc b/components/metrics/net/network_metrics_provider_unittest.cc
index 934fce1..cb0581dd 100644
--- a/components/metrics/net/network_metrics_provider_unittest.cc
+++ b/components/metrics/net/network_metrics_provider_unittest.cc
@@ -10,14 +10,13 @@
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "services/network/test/test_network_connection_tracker.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/system_profile.pb.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/network/network_handler_test_helper.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_IOS)
 #include "ios/web/public/test/web_task_environment.h"
@@ -45,9 +44,9 @@
   content::BrowserTaskEnvironment task_environment_{
       content::BrowserTaskEnvironment::IO_MAINLOOP};
 #endif
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::NetworkHandlerTestHelper network_handler_test_helper_;
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 };
 
 // Verifies that the effective connection type is correctly set.
diff --git a/components/metrics/persistent_histograms.cc b/components/metrics/persistent_histograms.cc
index f396e54b9..82497dc 100644
--- a/components/metrics/persistent_histograms.cc
+++ b/components/metrics/persistent_histograms.cc
@@ -19,7 +19,6 @@
 #include "base/task/thread_pool.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/metrics/persistent_system_profile.h"
 
 namespace {
@@ -250,9 +249,7 @@
     }
   }
 
-// TODO(crbug.com/40118868): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_LINUX)
   // Linux kernel 4.4.0.* shows a huge number of SIGBUS crashes with persistent
   // histograms enabled using a mapped file.  Change this to use local memory.
   // https://bugs.chromium.org/p/chromium/issues/detail?id=753741
diff --git a/components/metrics/structured/BUILD.gn b/components/metrics/structured/BUILD.gn
index 461c05db..366c8af 100644
--- a/components/metrics/structured/BUILD.gn
+++ b/components/metrics/structured/BUILD.gn
@@ -31,7 +31,7 @@
     "structured_metrics_service.h",
   ]
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     sources += [
       "flushed_map.cc",
       "flushed_map.h",
@@ -63,7 +63,7 @@
   ]
 }
 
-if (is_chromeos_ash) {
+if (is_chromeos) {
   source_set("external_metrics") {
     sources = [
       "external_metrics.cc",
@@ -251,7 +251,7 @@
     rebase_path(outdir, root_build_dir),
   ]
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     sources += [ "//tools/metrics/structured/sync/structured_chromiumos.xml" ]
 
     args += [
@@ -308,7 +308,7 @@
     "structured_metrics_service_unittest.cc",
   ]
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     sources += [ "flushed_map_unittest.cc" ]
   }
 
@@ -330,7 +330,7 @@
     "//testing/gtest",
   ]
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     sources += [ "external_metrics_unittest.cc" ]
 
     deps += [ ":external_metrics" ]
diff --git a/components/metrics/structured/buildflags/buildflags.gni b/components/metrics/structured/buildflags/buildflags.gni
index eec3955..0f491fea 100644
--- a/components/metrics/structured/buildflags/buildflags.gni
+++ b/components/metrics/structured/buildflags/buildflags.gni
@@ -2,10 +2,7 @@
 # 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")
-
 declare_args() {
   structured_metrics_enabled = is_win || is_mac || is_linux || is_chromeos
-  structured_metrics_debug_enabled =
-      is_win || is_mac || is_linux || is_chromeos_ash
+  structured_metrics_debug_enabled = is_win || is_mac || is_linux || is_chromeos
 }
diff --git a/components/metrics/structured/docs/sm_api.md b/components/metrics/structured/docs/sm_api.md
index 2eaddd08..8293843 100644
--- a/components/metrics/structured/docs/sm_api.md
+++ b/components/metrics/structured/docs/sm_api.md
@@ -1,6 +1,6 @@
 # Structured Metrics and CrOS Events API
 
-This document describes the client side API for defining and recording Structured Metrics and CrOS Events. Structured Metrics is supported on ChromeOS, Windows, Mac, and Linux. ChromeOS support includes LaCrOS, Ash Chrome, and Platform2 processes.
+This document describes the client side API for defining and recording Structured Metrics and CrOS Events. Structured Metrics is supported on ChromeOS, Windows, Mac, and Linux. ChromeOS support includes Ash Chrome, and Platform2 processes.
 
 This is not a technical document.
 
diff --git a/components/metrics/structured/structured_metrics_service.cc b/components/metrics/structured/structured_metrics_service.cc
index 57e1b76..61428db2 100644
--- a/components/metrics/structured/structured_metrics_service.cc
+++ b/components/metrics/structured/structured_metrics_service.cc
@@ -22,7 +22,7 @@
 
 namespace metrics::structured {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 StructuredMetricsService::ServiceIOHelper::ServiceIOHelper(
     scoped_refptr<StructuredMetricsRecorder> recorder)
     : recorder_(std::move(recorder)) {}
@@ -35,7 +35,7 @@
   recorder_->ProvideEventMetrics(uma_proto);
   return uma_proto;
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 StructuredMetricsService::StructuredMetricsService(
     MetricsServiceClient* client,
@@ -52,7 +52,7 @@
   CHECK(local_state);
   CHECK(recorder_);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
       {base::TaskPriority::BEST_EFFORT, base::MayBlock(),
        // Blocking because the works being done isn't to expensive.
@@ -68,7 +68,7 @@
     return;
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Because of construction order of the recorder and service, the service
   // needs to be set on the storage manager after it is created.
   if (base::FeatureList::IsEnabled(kEventStorageManager)) {
@@ -109,7 +109,7 @@
     Flush(metrics::MetricsLogsEventManager::CreateReason::kServiceShutdown);
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Because of construction order of the recorder and service, the delegate
   // must be unset here to avoid dangling pointers.
   if (base::FeatureList::IsEnabled(kEventStorageManager)) {
@@ -230,14 +230,14 @@
 // disk and must be accessed from an IO sequence.
 // Other platforms (Windows, Mac, and Linux), the events are stored only
 // in-memory and thus a blocking function isn't needed.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   BuildAndStoreLog(reason, notify_scheduler);
 #else
   BuildAndStoreLogSync(reason, notify_scheduler);
 #endif
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void StructuredMetricsService::BuildAndStoreLog(
     metrics::MetricsLogsEventManager::CreateReason reason,
     bool notify_scheduler) {
@@ -318,7 +318,7 @@
     scoped_refptr<StructuredMetricsRecorder> recorder) {
   recorder_ = std::move(recorder);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Reset the |io_helper_| with the new recorder.
   io_helper_.emplace(task_runner_, recorder_);
 #endif
diff --git a/components/metrics/structured/structured_metrics_service.h b/components/metrics/structured/structured_metrics_service.h
index 808dd3e4..26249887 100644
--- a/components/metrics/structured/structured_metrics_service.h
+++ b/components/metrics/structured/structured_metrics_service.h
@@ -198,7 +198,7 @@
 
 // Access to |recorder_| through |task_runner_| is only needed on Ash Chrome.
 // Other platforms can continue to access |recorder_| directly.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // An IO task runner for creating logs.
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
diff --git a/components/omnibox/browser/autocomplete_match.cc b/components/omnibox/browser/autocomplete_match.cc
index 76dfc40e..9f8f50f 100644
--- a/components/omnibox/browser/autocomplete_match.cc
+++ b/components/omnibox/browser/autocomplete_match.cc
@@ -971,8 +971,7 @@
     const AutocompleteInput& input,
     const TemplateURLService* template_url_service,
     const std::u16string& keyword,
-    const bool keep_search_intent_params,
-    const bool normalize_search_terms) {
+    const bool keep_search_intent_params) {
   if (!url.is_valid())
     return url;
 
@@ -993,17 +992,17 @@
       template_url_service, keyword, stripped_destination_url.host());
   if (template_url && template_url->SupportsReplacement(
                           template_url_service->search_terms_data())) {
-    using CacheKey = std::tuple<const TemplateURL*, GURL, bool, bool>;
+    using CacheKey = std::tuple<const TemplateURL*, GURL, bool>;
     static base::NoDestructor<base::LRUCache<CacheKey, GURL>> template_cache(
         30);
-    const CacheKey cache_key = {template_url, url, keep_search_intent_params,
-                                normalize_search_terms};
+    const CacheKey cache_key = {template_url, url, keep_search_intent_params};
     const auto& cached = template_cache->Get(cache_key);
     if (cached != template_cache->end()) {
       stripped_destination_url = cached->second;
     } else if (template_url->KeepSearchTermsInURL(
                    url, template_url_service->search_terms_data(),
-                   keep_search_intent_params, normalize_search_terms,
+                   keep_search_intent_params,
+                   /*normalize_search_terms=*/false,
                    &stripped_destination_url)) {
       template_cache->Put(cache_key, stripped_destination_url);
     }
@@ -1206,9 +1205,7 @@
   if (stripped_destination_url.is_empty()) {
     stripped_destination_url = GURLToStrippedGURL(
         destination_url, input, template_url_service, keyword,
-        /*keep_search_intent_params=*/false,
-        /*normalize_search_terms=*/
-        base::FeatureList::IsEnabled(omnibox::kNormalizeSearchSuggestions));
+        /*keep_search_intent_params=*/false);
   }
 }
 
diff --git a/components/omnibox/browser/autocomplete_match.h b/components/omnibox/browser/autocomplete_match.h
index 24d7f2c..3c0c94b 100644
--- a/components/omnibox/browser/autocomplete_match.h
+++ b/components/omnibox/browser/autocomplete_match.h
@@ -432,15 +432,11 @@
   // - If the match's keyword is known, it can be provided in `keyword`.
   //   Otherwise, it can be left empty and the template URL (if any) is
   //   determined from the destination's hostname.
-  // - If `normalize_search_terms` is true, the search terms in the final URL
-  //   will be converted to lowercase with extra whitespace characters
-  //   collapsed.
   static GURL GURLToStrippedGURL(const GURL& url,
                                  const AutocompleteInput& input,
                                  const TemplateURLService* template_url_service,
                                  const std::u16string& keyword,
-                                 const bool keep_search_intent_params,
-                                 const bool normalize_search_terms);
+                                 const bool keep_search_intent_params);
 
   // Sets the |match_in_scheme| and |match_in_subdomain| flags based on the
   // provided |url| and list of substring |match_positions|. |match_positions|
diff --git a/components/omnibox/browser/document_provider.cc b/components/omnibox/browser/document_provider.cc
index 2ef6ed1..4894eec 100644
--- a/components/omnibox/browser/document_provider.cc
+++ b/components/omnibox/browser/document_provider.cc
@@ -785,8 +785,7 @@
     // `matches_cache_`.
     match.stripped_destination_url = AutocompleteMatch::GURLToStrippedGURL(
         GURL(short_url), input_, client_->GetTemplateURLService(),
-        std::u16string(), /*keep_search_intent_params=*/false,
-        /*normalize_search_terms=*/false);
+        std::u16string(), /*keep_search_intent_params=*/false);
 
     match.contents =
         AutocompleteMatch::SanitizeString(base::UTF8ToUTF16(title));
diff --git a/components/omnibox/browser/search_provider.cc b/components/omnibox/browser/search_provider.cc
index 923c0f3c..2a7a3fd9 100644
--- a/components/omnibox/browser/search_provider.cc
+++ b/components/omnibox/browser/search_provider.cc
@@ -466,9 +466,6 @@
     const std::u16string& input_text,
     SearchSuggestionParser::Results* results) {
   std::u16string trimmed_input = base::CollapseWhitespace(input_text, false);
-  if (base::FeatureList::IsEnabled(omnibox::kNormalizeSearchSuggestions)) {
-    trimmed_input = base::i18n::ToLower(trimmed_input);
-  }
   for (auto& suggest_result : results->suggest_results)
     suggest_result.ClassifyMatchContents(false, trimmed_input);
   for (auto& navigation_result : results->navigation_results)
@@ -1188,14 +1185,9 @@
   // True if the user has asked this exact query previously.
   bool found_what_you_typed_match = false;
   std::u16string trimmed_input = base::CollapseWhitespace(input_text, false);
-  if (base::FeatureList::IsEnabled(omnibox::kNormalizeSearchSuggestions)) {
-    trimmed_input = base::i18n::ToLower(trimmed_input);
-  }
   for (const auto& result : results) {
     const std::u16string& trimmed_suggestion =
-        base::FeatureList::IsEnabled(omnibox::kNormalizeSearchSuggestions)
-            ? result->normalized_term
-            : base::CollapseWhitespace(result->term, false);
+        base::CollapseWhitespace(result->term, false);
 
     // Don't autocomplete multi-word queries that have only been seen once
     // unless the user has typed more than one word.
diff --git a/components/omnibox/browser/shortcuts_provider.cc b/components/omnibox/browser/shortcuts_provider.cc
index 7846333..128bc01 100644
--- a/components/omnibox/browser/shortcuts_provider.cc
+++ b/components/omnibox/browser/shortcuts_provider.cc
@@ -293,8 +293,7 @@
     const GURL stripped_destination_url(AutocompleteMatch::GURLToStrippedGURL(
         shortcut.match_core.destination_url, input, template_url_service,
         shortcut.match_core.keyword,
-        /*keep_search_intent_params=*/false, /*normalize_search_terms=*/
-        base::FeatureList::IsEnabled(omnibox::kNormalizeSearchSuggestions)));
+        /*keep_search_intent_params=*/false));
     shortcuts_by_url[stripped_destination_url].push_back(&shortcut);
   }
 
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc
index 0f401cbe..7700b75 100644
--- a/components/omnibox/common/omnibox_features.cc
+++ b/components/omnibox/common/omnibox_features.cc
@@ -109,17 +109,6 @@
              "LocalHistoryZeroSuggestBeyondNTP",
              DISABLED);
 
-// If enabled, SearchProvider uses `normalized_term` instead of `term` from the
-// `keyword_search_terms` table. `normalized_term` is the original search term
-// in lower case with extra whitespace characters collapsed. To ensure
-// suggestions from SearchProvider continue to get deduped with those from
-// ShortcutsProvider, AutocompleteMatch::GURLToStrippedGURL uses the normalized
-// term to build the destination URLs so they are identical despite case
-// mismatches in the terms.
-BASE_FEATURE(kNormalizeSearchSuggestions,
-             "NormalizeSearchSuggestions",
-             DISABLED);
-
 // If enabled, zero prefix suggestions will be stored using an in-memory caching
 // service, instead of using the existing prefs-based cache.
 BASE_FEATURE(kZeroSuggestInMemoryCaching,
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h
index 8c3a222e..2aa591ecf 100644
--- a/components/omnibox/common/omnibox_features.h
+++ b/components/omnibox/common/omnibox_features.h
@@ -41,7 +41,6 @@
 BASE_DECLARE_FEATURE(kClobberTriggersContextualWebZeroSuggest);
 BASE_DECLARE_FEATURE(kClobberTriggersSRPZeroSuggest);
 BASE_DECLARE_FEATURE(kLocalHistoryZeroSuggestBeyondNTP);
-BASE_DECLARE_FEATURE(kNormalizeSearchSuggestions);
 BASE_DECLARE_FEATURE(kZeroSuggestInMemoryCaching);
 BASE_DECLARE_FEATURE(kZeroSuggestPrefetchDebouncing);
 BASE_DECLARE_FEATURE(kZeroSuggestPrefetching);
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal
index f922d0d..31cb54d 160000
--- a/components/optimization_guide/internal
+++ b/components/optimization_guide/internal
@@ -1 +1 @@
-Subproject commit f922d0d5ccb76da8ca58e7feeac432cd43b0d214
+Subproject commit 31cb54d3ac17e8a7fe30aca3e1a0b29d26c2acc6
diff --git a/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc
index f4530d89..047836a 100644
--- a/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc
+++ b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc
@@ -5,6 +5,7 @@
 #include "components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.h"
 
 #include "base/metrics/histogram_functions.h"
+#include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/trace_id_helper.h"
 #include "base/tracing/protos/chrome_track_event.pbzero.h"
@@ -20,6 +21,33 @@
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
 
+namespace {
+
+void RecordShiftedTimeHistogram(const std::string& histogram_name,
+                                base::TimeDelta time) {
+  // Generated with Histogram::InitializeBucketRanges. Firstly generate an array
+  // by `Histogram::InitializeBucketRanges(0, 60000, ranges)`, and then expand
+  // the array to two sides of the axis of 60000.
+  static const std::vector<int> ranges = {
+      0,     11600, 20957, 28505, 34594, 39506, 43468, 46664,  49242, 51322,
+      53000, 54353, 55445, 56326, 57036, 57609, 58071, 58444,  58745, 58988,
+      59184, 59342, 59469, 59572, 59655, 59722, 59776, 59819,  59854, 59882,
+      59905, 59923, 59938, 59950, 59960, 59968, 59974, 59979,  59983, 59986,
+      59989, 59991, 59993, 59994, 59995, 59996, 59997, 59998,  59999, 60000,
+      60001, 60002, 60003, 60004, 60005, 60006, 60007, 60009,  60011, 60014,
+      60017, 60021, 60026, 60032, 60040, 60050, 60062, 60077,  60095, 60118,
+      60146, 60181, 60224, 60278, 60345, 60428, 60531, 60658,  60816, 61012,
+      61255, 61556, 61929, 62391, 62964, 63674, 64555, 65647,  67000, 68678,
+      70758, 73336, 76532, 80494, 85406, 91495, 99043, 108400, 120000};
+  static const std::vector<base::HistogramBase::Sample> samples =
+      base::CustomHistogram::ArrayToCustomEnumRanges(ranges);
+  base::HistogramBase* time_histogram = base::CustomHistogram::FactoryGet(
+      histogram_name, samples, base::HistogramBase::kUmaTargetedHistogramFlag);
+  time_histogram->Add(time.InMilliseconds());
+}
+
+}  // namespace
+
 namespace internal {
 
 const char kHistogramPrerenderNavigationToActivation[] =
@@ -61,7 +89,7 @@
 
 // Lead time brought by prerender
 const char kDomContentLoadedToActivation[] =
-    "PageLoad.Internal.Prerender2.DomContentLoadedToActivation";
+    "PageLoad.Internal.Prerender2.DomContentLoadedToActivation2";
 
 }  // namespace internal
 
@@ -259,11 +287,13 @@
   base::TimeDelta dom_content_loaded_event_start =
       main_frame_timing.document_timing->dom_content_loaded_event_start
           .value_or(upper_bound + navigation_to_activation_time_.value());
-
-  base::UmaHistogramCustomTimes(
-      AppendSuffix(internal::kDomContentLoadedToActivation),
-      navigation_to_activation_time_.value() - dom_content_loaded_event_start,
-      -upper_bound, upper_bound, 100);
+  // Shift the duration by the upper bound because UMA cannot handle negative
+  // values.
+  base::TimeDelta shifted_duration = navigation_to_activation_time_.value() -
+                                     dom_content_loaded_event_start +
+                                     upper_bound;
+  RecordShiftedTimeHistogram(
+      AppendSuffix(internal::kDomContentLoadedToActivation), shifted_duration);
 
   // TODO(crbug.com/40240492): Add more metrics to track the loading progress on
   // the renderer side, e.g., loaded the blocking resources, etc.
diff --git a/components/plus_addresses/metrics/plus_address_metrics.cc b/components/plus_addresses/metrics/plus_address_metrics.cc
index 6a41747b..b6b81f9 100644
--- a/components/plus_addresses/metrics/plus_address_metrics.cc
+++ b/components/plus_addresses/metrics/plus_address_metrics.cc
@@ -7,7 +7,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
 #include "base/strings/string_util.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/plus_addresses/plus_address_types.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 
diff --git a/components/plus_addresses/metrics/plus_address_metrics.h b/components/plus_addresses/metrics/plus_address_metrics.h
index 5c24dfa3..7f5f108 100644
--- a/components/plus_addresses/metrics/plus_address_metrics.h
+++ b/components/plus_addresses/metrics/plus_address_metrics.h
@@ -8,7 +8,7 @@
 #include <string>
 
 #include "base/time/time.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/plus_addresses/plus_address_types.h"
 
 class GoogleServiceAuthError;
diff --git a/components/plus_addresses/metrics/plus_address_submission_logger.cc b/components/plus_addresses/metrics/plus_address_submission_logger.cc
index e29fdac..685f496 100644
--- a/components/plus_addresses/metrics/plus_address_submission_logger.cc
+++ b/components/plus_addresses/metrics/plus_address_submission_logger.cc
@@ -17,9 +17,9 @@
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_field.h"
 #include "components/autofill/core/browser/autofill_manager.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/data_model/borrowed_transliterator.h"
 #include "components/autofill/core/browser/form_structure.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/ui/suggestion_type.h"
 #include "components/autofill/core/common/unique_ids.h"
 #include "components/commerce/core/heuristics/commerce_heuristics_provider.h"
diff --git a/components/plus_addresses/metrics/plus_address_submission_logger.h b/components/plus_addresses/metrics/plus_address_submission_logger.h
index d42f4eac..82360ab3 100644
--- a/components/plus_addresses/metrics/plus_address_submission_logger.h
+++ b/components/plus_addresses/metrics/plus_address_submission_logger.h
@@ -12,7 +12,7 @@
 #include "base/memory/raw_ref.h"
 #include "base/scoped_multi_source_observation.h"
 #include "components/autofill/core/browser/autofill_manager.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/password_form_classification.h"
 #include "components/autofill/core/common/unique_ids.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
diff --git a/components/plus_addresses/metrics/plus_address_submission_logger_unittest.cc b/components/plus_addresses/metrics/plus_address_submission_logger_unittest.cc
index 736e0a2..ef3c929 100644
--- a/components/plus_addresses/metrics/plus_address_submission_logger_unittest.cc
+++ b/components/plus_addresses/metrics/plus_address_submission_logger_unittest.cc
@@ -13,8 +13,8 @@
 #include "base/test/task_environment.h"
 #include "base/types/cxx23_to_underlying.h"
 #include "components/autofill/core/browser/autofill_form_test_utils.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/field_types.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/password_form_classification.h"
 #include "components/autofill/core/browser/test_autofill_client.h"
 #include "components/autofill/core/browser/test_autofill_driver.h"
diff --git a/components/plus_addresses/plus_address_service.h b/components/plus_addresses/plus_address_service.h
index ccb11bc..36cf9e7 100644
--- a/components/plus_addresses/plus_address_service.h
+++ b/components/plus_addresses/plus_address_service.h
@@ -12,7 +12,7 @@
 #include "base/functional/callback.h"
 #include "base/observer_list_types.h"
 #include "components/affiliations/core/browser/affiliation_utils.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/common/plus_address_survey_type.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/plus_addresses/plus_address_types.h"
diff --git a/components/plus_addresses/plus_address_service_impl.h b/components/plus_addresses/plus_address_service_impl.h
index 45b446e0..16b4dedc 100644
--- a/components/plus_addresses/plus_address_service_impl.h
+++ b/components/plus_addresses/plus_address_service_impl.h
@@ -14,7 +14,7 @@
 #include "base/observer_list.h"
 #include "base/observer_list_types.h"
 #include "base/scoped_observation.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/password_form_classification.h"
 #include "components/plus_addresses/affiliations/plus_address_affiliation_match_helper.h"
 #include "components/plus_addresses/metrics/plus_address_submission_logger.h"
diff --git a/components/plus_addresses/plus_address_service_impl_unittest.cc b/components/plus_addresses/plus_address_service_impl_unittest.cc
index de22b31..2492e68 100644
--- a/components/plus_addresses/plus_address_service_impl_unittest.cc
+++ b/components/plus_addresses/plus_address_service_impl_unittest.cc
@@ -27,7 +27,7 @@
 #include "base/types/cxx23_to_underlying.h"
 #include "components/affiliations/core/browser/affiliation_utils.h"
 #include "components/affiliations/core/browser/mock_affiliation_service.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #include "components/autofill/core/browser/password_form_classification.h"
 #include "components/autofill/core/browser/ui/suggestion.h"
 #include "components/autofill/core/browser/ui/suggestion_hiding_reason.h"
diff --git a/components/plus_addresses/plus_address_types.h b/components/plus_addresses/plus_address_types.h
index 882d0f6..2bdb558 100644
--- a/components/plus_addresses/plus_address_types.h
+++ b/components/plus_addresses/plus_address_types.h
@@ -16,7 +16,7 @@
 #include "base/types/expected.h"
 #include "base/types/strong_alias.h"
 #include "components/affiliations/core/browser/affiliation_utils.h"
-#include "components/autofill/core/browser/autofill_plus_address_delegate.h"
+#include "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 
 // A common place for PlusAddress types to be defined.
 namespace plus_addresses {
diff --git a/components/policy/resources/templates/policies.yaml b/components/policy/resources/templates/policies.yaml
index bb8031c0..87688100 100644
--- a/components/policy/resources/templates/policies.yaml
+++ b/components/policy/resources/templates/policies.yaml
@@ -1323,6 +1323,7 @@
   1322: DeviceFlexArcPreloadEnabled
   1323: AllowedInputMethodsForceEnabled
   1324: WebRtcIPHandlingUrl
+  1325: GenAIPhotoEditingSettings
 
 
 atomic_groups:
diff --git a/components/policy/resources/templates/policy_definitions/GenerativeAI/GenAIPhotoEditingSettings.yaml b/components/policy/resources/templates/policy_definitions/GenerativeAI/GenAIPhotoEditingSettings.yaml
new file mode 100644
index 0000000..7f7fcd0
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitions/GenerativeAI/GenAIPhotoEditingSettings.yaml
@@ -0,0 +1,40 @@
+caption: Settings for Generative AI Photo Editing feature
+desc: |-
+  This policy controls the settings of the Generative AI Photo Editing feature for <ph name="PRODUCT_OS_NAME">$1<ex>Google ChromeOS</ex></ph>.
+
+  0 = Enable the feature for users, and send relevant data to Google to help train or improve AI models. Relevant data may include prompts, inputs, outputs, and source materials, depending on the feature. It may be reviewed by humans for the sole purpose of improving AI models. 0 is the default value, except when noted below.
+
+  1 = Enable the feature for users, but do not send data to Google to train or improve AI models. 1 is the default value for Enterprise users managed by <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME">Google Admin console</ph> and for Education accounts managed by <ph name="GOOGLE_WORKSPACE_PRODUCT_NAME">Google Workspace</ph>.
+
+  2 = Disable the feature.
+
+default: 0
+example_value: 2
+features:
+  # Policy changes do not require a browser restart. However, the new policy
+  # will be applied the next time users open a new photo, not immediately.
+  # It is because the user might be actively editing during policy update.
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- file://chromeos/ash/components/mantis/OWNERS
+items:
+- caption: Allow Generative AI Photo Editing and improve AI models.
+  name: Allowed
+  value: 0
+- caption: Allow Generative AI Photo Editing without improving AI models.
+  name: AllowedWithoutLogging
+  value: 1
+- caption: Do not allow Generative AI Photo Editing.
+  name: Disabled
+  value: 2
+schema:
+  enum:
+  - 0
+  - 1
+  - 2
+  type: integer
+future_on:
+- chrome_os
+tags: []
+type: int-enum
diff --git a/components/policy/test/data/pref_mapping/GenAIPhotoEditingSettings.json b/components/policy/test/data/pref_mapping/GenAIPhotoEditingSettings.json
new file mode 100644
index 0000000..31fc7b0
--- /dev/null
+++ b/components/policy/test/data/pref_mapping/GenAIPhotoEditingSettings.json
@@ -0,0 +1,70 @@
+[
+  {
+    "os": [
+      "chromeos_ash"
+    ],
+    "policy_pref_mapping_tests": [
+      {
+        "note": "The default is changed by GenAiDefaultSettings",
+        "policies": {},
+        "prefs": {
+          "ash.gen_ai_photo_editing_settings": {
+            "value": 1,
+            "location": "user_profile"
+          }
+        }
+      },
+      {
+        "policies": {
+          "GenAIPhotoEditingSettings": 0
+        },
+        "prefs": {
+          "ash.gen_ai_photo_editing_settings": {
+            "value": 0,
+            "location": "user_profile"
+          }
+        }
+      },
+      {
+        "policies": {
+          "GenAIPhotoEditingSettings": 1
+        },
+        "prefs": {
+          "ash.gen_ai_photo_editing_settings": {
+            "value": 1,
+            "location": "user_profile"
+          }
+        }
+      },
+      {
+        "policies": {
+          "GenAIPhotoEditingSettings": 2
+        },
+        "prefs": {
+          "ash.gen_ai_photo_editing_settings": {
+            "value": 2,
+            "location": "user_profile"
+          }
+        }
+      }
+    ]
+  },
+  {
+    "os": [
+      "win",
+      "linux",
+      "mac"
+    ],
+    "policy_pref_mapping_tests": [
+      {
+        "note": "The default is changed by GenAiDefaultSettings only on ChromeOS",
+        "policies": {},
+        "prefs": {
+          "ash.gen_ai_photo_editing_settings": {
+            "default_value": 0
+          }
+        }
+      }
+    ]
+  }
+]
diff --git a/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json b/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json
index 29b8469..6d65e9f 100644
--- a/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json
+++ b/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json
@@ -193,6 +193,9 @@
           },
           "settings.managed.help_me_read": {
             "value": 0
+          },
+          "ash.gen_ai_photo_editing_settings": {
+            "value": 0
           }
         }
       },
@@ -228,6 +231,9 @@
           },
           "settings.managed.help_me_read": {
             "value": 1
+          },
+          "ash.gen_ai_photo_editing_settings": {
+            "value": 1
           }
         }
       },
@@ -243,7 +249,8 @@
           "TabCompareSettings": 2,
           "GenAIWallpaperSettings": 2,
           "GenAIVcBackgroundSettings": 2,
-          "HelpMeReadSettings": 2
+          "HelpMeReadSettings": 2,
+          "GenAIPhotoEditingSettings": 2
         },
         "prefs": {
           "optimization_guide.model_execution.autofill_prediction_improvements_enterprise_policy_allowed": {
@@ -275,6 +282,9 @@
           },
           "settings.managed.help_me_read": {
             "value": 2
+          },
+          "ash.gen_ai_photo_editing_settings": {
+            "value": 2
           }
         }
       }
diff --git a/components/pref_registry/BUILD.gn b/components/pref_registry/BUILD.gn
index 1712e40..e998951b 100644
--- a/components/pref_registry/BUILD.gn
+++ b/components/pref_registry/BUILD.gn
@@ -11,7 +11,6 @@
 
   public_deps = [
     "//base",
-    "//build:chromeos_buildflags",
     "//components/prefs",
   ]
 }
diff --git a/components/pref_registry/pref_registry_syncable.cc b/components/pref_registry/pref_registry_syncable.cc
index 4d9a27f..2520e8da2 100644
--- a/components/pref_registry/pref_registry_syncable.cc
+++ b/components/pref_registry/pref_registry_syncable.cc
@@ -9,14 +9,13 @@
 #include "base/files/file_path.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
-#include "build/chromeos_buildflags.h"
 #include "components/prefs/default_pref_store.h"
 
 namespace user_prefs {
 namespace {
 
 constexpr uint32_t kSyncablePrefFlags =
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     PrefRegistrySyncable::SYNCABLE_OS_PREF |
     PrefRegistrySyncable::SYNCABLE_OS_PRIORITY_PREF |
 #endif
@@ -40,7 +39,7 @@
   // SYNCABLE_PRIORITY_PREF flags at the same time.
   DCHECK(!(flags & PrefRegistrySyncable::SYNCABLE_PREF) ||
          !(flags & PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF));
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Ditto for the mutually exclusive OS pref flags.
   DCHECK(!(flags & PrefRegistrySyncable::SYNCABLE_OS_PREF) ||
          !(flags & PrefRegistrySyncable::SYNCABLE_OS_PRIORITY_PREF));
diff --git a/components/pref_registry/pref_registry_syncable.h b/components/pref_registry/pref_registry_syncable.h
index 960a836..45789c49 100644
--- a/components/pref_registry/pref_registry_syncable.h
+++ b/components/pref_registry/pref_registry_syncable.h
@@ -11,7 +11,6 @@
 
 #include "base/component_export.h"
 #include "base/functional/callback.h"
-#include "build/chromeos_buildflags.h"
 #include "components/prefs/pref_registry_simple.h"
 
 // TODO(tfarina): Change this namespace to pref_registry.
@@ -56,7 +55,7 @@
     // -- they are preferred for receiving server-provided data.
     SYNCABLE_PRIORITY_PREF = 1 << 1,
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // As above, but the pref is for an OS settings (e.g. keyboard layout).
     // This distinction allows OS pref sync to be controlled independently from
     // browser pref sync in the UI.
diff --git a/components/printing/browser/BUILD.gn b/components/printing/browser/BUILD.gn
index c852d88..478121d 100644
--- a/components/printing/browser/BUILD.gn
+++ b/components/printing/browser/BUILD.gn
@@ -18,7 +18,6 @@
 
   deps = [
     "//base",
-    "//build:chromeos_buildflags",
     "//components/crash/core/common",
     "//components/discardable_memory/service",
     "//components/enterprise/buildflags",
diff --git a/components/printing/common/BUILD.gn b/components/printing/common/BUILD.gn
index 9c06193..6f6f844 100644
--- a/components/printing/common/BUILD.gn
+++ b/components/printing/common/BUILD.gn
@@ -18,7 +18,6 @@
   deps = [
     ":mojo_interfaces",
     "//base",
-    "//build:chromeos_buildflags",
     "//components/cloud_devices/common:common",
     "//printing",
     "//printing/backend",
diff --git a/components/printing/common/cloud_print_cdd_conversion.cc b/components/printing/common/cloud_print_cdd_conversion.cc
index 9eb83e3..4045751 100644
--- a/components/printing/common/cloud_print_cdd_conversion.cc
+++ b/components/printing/common/cloud_print_cdd_conversion.cc
@@ -15,7 +15,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/cloud_devices/common/cloud_device_description.h"
 #include "components/cloud_devices/common/printer_description.h"
 #include "printing/backend/print_backend.h"
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc
index e1e76234..18a8d641 100644
--- a/components/printing/renderer/print_render_frame_helper.cc
+++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -1411,7 +1411,7 @@
 }
 
 void PrintRenderFrameHelper::InitiatePrintPreview(
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     mojo::PendingAssociatedRemote<mojom::PrintRenderer> print_renderer,
 #endif
     bool has_selection) {
@@ -1423,7 +1423,7 @@
     return;
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (print_renderer) {
     print_renderer_.Bind(std::move(print_renderer));
     print_preview_context_.SetIsForArc(true);
@@ -1457,7 +1457,7 @@
 
   print_preview_context_.OnPrintPreview();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (print_preview_context_.IsForArc()) {
     base::UmaHistogramEnumeration("Arc.PrintPreview.PreviewEvent",
                                   PREVIEW_EVENT_REQUESTED, PREVIEW_EVENT_MAX);
@@ -1476,7 +1476,7 @@
     return;
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Save the job settings if a PrintRenderer will be used to create the preview
   // document.
   if (print_renderer_)
@@ -1664,7 +1664,7 @@
   }
 
   CreatePreviewDocumentResult result = CreatePreviewDocument();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (result == CreatePreviewDocumentResult::kInProgress) {
     return;
   }
@@ -1680,7 +1680,7 @@
   if (!print_pages_params_ || CheckForCancel() || !preview_ui_)
     return CreatePreviewDocumentResult::kFail;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (print_preview_context_.IsForArc()) {
     base::UmaHistogramEnumeration("Arc.PrintPreview.PreviewEvent",
                                   PREVIEW_EVENT_CREATE_DOCUMENT,
@@ -1692,7 +1692,7 @@
 
   bool require_document_metafile =
       print_params.printed_doc_type != mojom::SkiaDocumentType::kMSKP;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   require_document_metafile = require_document_metafile || print_renderer_;
 #endif
 
@@ -1751,7 +1751,7 @@
   if (CheckForCancel())
     return CreatePreviewDocumentResult::kFail;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // If a PrintRenderer has been provided, use it to create the preview
   // document.
   if (print_renderer_) {
@@ -1915,7 +1915,7 @@
   return true;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void PrintRenderFrameHelper::OnPreviewDocumentCreated(
     int document_cookie,
     base::TimeTicks begin_time,
@@ -2646,15 +2646,12 @@
     }
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  const bool is_from_arc = print_preview_context_.IsForArc();
-#endif
   const bool is_modifiable = print_preview_context_.IsModifiable();
   const bool has_selection = print_preview_context_.HasSelection();
 
   auto params = mojom::RequestPrintPreviewParams::New();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  params->is_from_arc = is_from_arc;
+#if BUILDFLAG(IS_CHROMEOS)
+  params->is_from_arc = print_preview_context_.IsForArc();
 #endif
   params->is_modifiable = is_modifiable;
   params->has_selection = has_selection;
@@ -2714,7 +2711,7 @@
     }
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (print_preview_context_.IsForArc()) {
     base::UmaHistogramEnumeration("Arc.PrintPreview.PreviewEvent",
                                   PREVIEW_EVENT_INITIATED, PREVIEW_EVENT_MAX);
@@ -2929,7 +2926,7 @@
   if (report_error) {
     DCHECK_NE(PrintPreviewErrorBuckets::kNone, error_);
     const char* name = "PrintPreview.RendererError";
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     if (is_for_arc_)
       name = "Arc.PrintPreview.RendererError";
 #endif
@@ -2950,7 +2947,7 @@
   return state_ == State::kRendering || state_ == State::kDone;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 bool PrintRenderFrameHelper::PrintPreviewContext::IsForArc() const {
   DCHECK_NE(state_, State::kUninitialized);
   return is_for_arc_;
@@ -2982,7 +2979,7 @@
   return static_cast<size_t>(current_page_index_) == pages_to_render_.size();
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 void PrintRenderFrameHelper::PrintPreviewContext::SetIsForArc(bool is_for_arc) {
   is_for_arc_ = is_for_arc;
 }
diff --git a/components/printing/renderer/print_render_frame_helper.h b/components/printing/renderer/print_render_frame_helper.h
index b8c80318..ce8ac0a 100644
--- a/components/printing/renderer/print_render_frame_helper.h
+++ b/components/printing/renderer/print_render_frame_helper.h
@@ -18,7 +18,6 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "cc/paint/paint_canvas.h"
 #include "components/printing/common/print.mojom.h"
 #include "content/public/renderer/render_frame_observer.h"
@@ -176,7 +175,7 @@
   // asynchronously by a PrintRenderer.
   enum class CreatePreviewDocumentResult {
     kSuccess = 0,
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     kInProgress = 1,
 #endif
     kFail = 2,
@@ -267,7 +266,7 @@
   void SetPrintPreviewUI(
       mojo::PendingAssociatedRemote<mojom::PrintPreviewUI> preview) override;
   void InitiatePrintPreview(
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       mojo::PendingAssociatedRemote<mojom::PrintRenderer> print_renderer,
 #endif
       bool has_selection) override;
@@ -301,7 +300,7 @@
   // Finalize the print ready preview document.
   bool FinalizePrintReadyDocument();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Called after a preview document has been created by a PrintRenderer.
   void OnPreviewDocumentCreated(
       int document_cookie,
@@ -454,7 +453,7 @@
   // Used to check the prerendering status.
   const std::unique_ptr<Delegate> delegate_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Settings used by a PrintRenderer to create a preview document.
   base::Value::Dict print_renderer_job_settings_;
 
@@ -525,7 +524,7 @@
     // Helper functions
     uint32_t GetNextPageIndex();
     bool IsRendering() const;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     bool IsForArc() const;
 #endif
     bool IsPlugin() const;
@@ -535,7 +534,7 @@
     bool IsFinalPageRendered() const;
 
     // Setters
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     void SetIsForArc(bool is_for_arc);
 #endif
     void set_error(PrintPreviewErrorBuckets error);
@@ -599,7 +598,7 @@
     // True, if the document source is modifiable. e.g. HTML and not PDF.
     bool is_modifiable_ = true;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // True, if the document source is from ARC.
     bool is_for_arc_ = false;
 #endif
diff --git a/components/printing/test/print_render_frame_helper_browsertest.cc b/components/printing/test/print_render_frame_helper_browsertest.cc
index 717e717..7a6cfdc 100644
--- a/components/printing/test/print_render_frame_helper_browsertest.cc
+++ b/components/printing/test/print_render_frame_helper_browsertest.cc
@@ -20,7 +20,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/printing/common/print.mojom-test-utils.h"
 #include "components/printing/common/print.mojom.h"
 #include "components/printing/common/print_params.h"
@@ -86,7 +85,7 @@
     "<div>page3</div>"
     "</body></html>";
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // A simple webpage with a button to print itself with.
 const char kPrintOnUserAction[] =
     "<body>"
@@ -149,7 +148,7 @@
     "<p>The quick brown fox jumped over the lazy dog.</p>"
     "</body></html>";
 #endif  // BUILDFLAG(ENABLE_PRINT_PREVIEW)
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
 class FakePrintPreviewUI : public mojom::PrintPreviewUI {
@@ -1711,7 +1710,7 @@
 #endif  // MOCK_PRINTER_SUPPORTS_PAGE_IMAGES
 
 // These print preview tests do not work on Chrome OS yet.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
 class PrintRenderFrameHelperPreviewTest
@@ -1740,7 +1739,7 @@
     PrintRenderFrameHelper* print_render_frame_helper =
         GetPrintRenderFrameHelper();
     print_render_frame_helper->InitiatePrintPreview(
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
         mojo::NullAssociatedRemote(),
 #endif
         /*has_selection=*/false);
@@ -1775,7 +1774,7 @@
         GetPrintRenderFrameHelperForFrame(render_frame);
     print_render_frame_helper->SetPrintPreviewUI(preview_ui->BindReceiver());
     print_render_frame_helper->InitiatePrintPreview(
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
         mojo::NullAssociatedRemote(),
 #endif
         has_selection);
@@ -3652,6 +3651,6 @@
 
 #endif  // BUILDFLAG(ENABLE_PRINT_PREVIEW)
 
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace printing
diff --git a/components/proxy_config/BUILD.gn b/components/proxy_config/BUILD.gn
index 82b3e232..0589705d 100644
--- a/components/proxy_config/BUILD.gn
+++ b/components/proxy_config/BUILD.gn
@@ -2,8 +2,6 @@
 # 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")
-
 component("proxy_config") {
   sources = [
     "pref_proxy_config_tracker.cc",
@@ -35,7 +33,7 @@
   # and disable include checking so GN doesn't complain about the missing
   # dependency (it still links OK). This cycle should be fixed and header
   # checking enabled.
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     check_includes = false
   } else {
     deps += [ "//components/pref_registry" ]
diff --git a/components/proxy_config/pref_proxy_config_tracker_impl.cc b/components/proxy_config/pref_proxy_config_tracker_impl.cc
index 910a90ee..379b0962 100644
--- a/components/proxy_config/pref_proxy_config_tracker_impl.cc
+++ b/components/proxy_config/pref_proxy_config_tracker_impl.cc
@@ -290,13 +290,6 @@
   if (pref->IsExtensionControlled()) {
     return ProxyPrefs::CONFIG_EXTENSION;
   }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  if (pref->IsStandaloneBrowserControlled()) {
-    // The proxy config is controlled by an extension active in the Lacros
-    // primary profile.
-    return ProxyPrefs::CONFIG_EXTENSION;
-  }
-#endif
   return ProxyPrefs::CONFIG_OTHER_PRECEDE;
 }
 
diff --git a/components/reduce_accept_language/browser/reduce_accept_language_service.cc b/components/reduce_accept_language/browser/reduce_accept_language_service.cc
index 0e3ea4e..e670649 100644
--- a/components/reduce_accept_language/browser/reduce_accept_language_service.cc
+++ b/components/reduce_accept_language/browser/reduce_accept_language_service.cc
@@ -41,7 +41,7 @@
     : settings_map_(settings_map), is_incognito_(is_incognito) {
   DCHECK(settings_map_);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   const std::string& key = language::prefs::kPreferredLanguages;
 #else
   const std::string& key = language::prefs::kAcceptLanguages;
diff --git a/components/renderer_context_menu/BUILD.gn b/components/renderer_context_menu/BUILD.gn
index eb538f1..60a89c8 100644
--- a/components/renderer_context_menu/BUILD.gn
+++ b/components/renderer_context_menu/BUILD.gn
@@ -19,7 +19,6 @@
 
   deps = [
     "//base",
-    "//build:chromeos_buildflags",
     "//components/search_engines",
     "//components/vector_icons",
     "//content/public/browser",
diff --git a/components/renderer_context_menu/render_view_context_menu_base.cc b/components/renderer_context_menu/render_view_context_menu_base.cc
index b08b752..10f9eec 100644
--- a/components/renderer_context_menu/render_view_context_menu_base.cc
+++ b/components/renderer_context_menu/render_view_context_menu_base.cc
@@ -13,7 +13,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/observer_list.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/vector_icons/vector_icons.h"
 #include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/render_frame_host.h"
@@ -292,7 +291,7 @@
     return;
 
   menu_model_.SetIcon(index.value(), icon);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (toolkit_delegate_)
     toolkit_delegate_->RebuildMenu();
 #endif
diff --git a/components/rlz/BUILD.gn b/components/rlz/BUILD.gn
index 0da57470..d79398de 100644
--- a/components/rlz/BUILD.gn
+++ b/components/rlz/BUILD.gn
@@ -2,8 +2,6 @@
 # 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")
-
 static_library("rlz") {
   sources = [
     "rlz_tracker.cc",
@@ -23,13 +21,12 @@
     sources += [ "rlz_tracker_win.cc" ]
   }
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     sources += [ "rlz_tracker_chromeos.cc" ]
   }
 
   deps = [
     "//base",
-    "//build:chromeos_buildflags",
     "//components/google/core/common",
     "//net",
     "//rlz:rlz_lib",
@@ -60,14 +57,13 @@
 
   deps = [
     ":rlz",
-    "//build:chromeos_buildflags",
     "//net:test_support",
     "//rlz:test_support",
     "//services/network/public/cpp:cpp",
     "//ui/base",
   ]
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     deps += [ "//chromeos/ash/components/system" ]
   }
 }
diff --git a/components/rlz/rlz_tracker.cc b/components/rlz/rlz_tracker.cc
index 1b41c74c..85b8273 100644
--- a/components/rlz/rlz_tracker.cc
+++ b/components/rlz/rlz_tracker.cc
@@ -20,7 +20,6 @@
 #include "base/task/thread_pool.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/rlz/rlz_tracker_delegate.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -28,7 +27,7 @@
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/mojom/url_loader.mojom.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "base/syslog_logging.h"
 #endif
 
@@ -37,7 +36,7 @@
 
 // Maximum and minimum delay for financial ping we would allow to be set through
 // master preferences. Somewhat arbitrary, may need to be adjusted in future.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 const base::TimeDelta kMinInitDelay = base::Seconds(60);
 const base::TimeDelta kMaxInitDelay = base::Hours(24);
 #else
@@ -154,7 +153,7 @@
   std::string lang_ascii(base::UTF16ToASCII(lang));
   std::string referral_ascii(base::UTF16ToASCII(referral));
   std::string product_signature;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   product_signature = "chromeos";
 #else
   product_signature = "chrome";
@@ -316,7 +315,7 @@
   }
   delegate_->GetReactivationBrand(&reactivation_brand_);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // If the brand is organic, RLZ is essentially disabled.  Write a log to the
   // console for administrators and QA.
   if (delegate_->IsBrandOrganic(brand_) &&
@@ -621,7 +620,7 @@
   return true;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // static
 void RLZTracker::ClearRlzState() {
   RLZTracker* tracker = GetInstance();
diff --git a/components/rlz/rlz_tracker.h b/components/rlz/rlz_tracker.h
index 583f167..375b88f 100644
--- a/components/rlz/rlz_tracker.h
+++ b/components/rlz/rlz_tracker.h
@@ -15,7 +15,6 @@
 #include "base/thread_annotations.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "rlz/lib/rlz_lib.h"
 
 namespace base {
@@ -94,7 +93,7 @@
   // Invoked during shutdown to clean up any state created by RLZTracker.
   static void CleanupRlz();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Clears all product state. Should be called when turning RLZ off. On other
   // platforms, this is done by product uninstaller.
   static void ClearRlzState();
@@ -204,7 +203,7 @@
                                  const std::u16string& lang,
                                  const std::u16string& referral);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Implementation called from ClearRlzState static method.
   void ClearRlzStateImpl();
 
diff --git a/components/rlz/rlz_tracker_unittest.cc b/components/rlz/rlz_tracker_unittest.cc
index d5bbab78..59a14b8 100644
--- a/components/rlz/rlz_tracker_unittest.cc
+++ b/components/rlz/rlz_tracker_unittest.cc
@@ -14,7 +14,6 @@
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/rlz/rlz_tracker_delegate.h"
 #include "net/url_request/url_request_test_util.h"
 #include "rlz/test/rlz_test_helpers.h"
@@ -25,7 +24,7 @@
 #include "ui/base/device_form_factor.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chromeos/ash/components/system/fake_statistics_provider.h"
 #endif
 
@@ -218,7 +217,7 @@
     return !assume_not_ui_thread_;
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   bool ScheduleClearRlzState() override { return !assume_not_ui_thread_; }
 #endif
 
@@ -268,7 +267,7 @@
   std::unique_ptr<TestRLZTracker> tracker_;
   RlzLibTestNoMachineStateHelper m_rlz_test_helper_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   std::unique_ptr<ash::system::FakeStatisticsProvider> statistics_provider_;
 #endif
 };
@@ -286,14 +285,14 @@
   SetMainBrand("TEST");
   SetReactivationBrand("");
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   statistics_provider_ =
       std::make_unique<ash::system::FakeStatisticsProvider>();
   ash::system::StatisticsProvider::SetTestProvider(statistics_provider_.get());
   statistics_provider_->SetMachineStatistic(
       ash::system::kShouldSendRlzPingKey,
       ash::system::kShouldSendRlzPingValueTrue);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 void RlzLibTest::TearDown() {
@@ -302,9 +301,9 @@
   testing::Test::TearDown();
   m_rlz_test_helper_.TearDown();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   ash::system::StatisticsProvider::SetTestProvider(nullptr);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 void RlzLibTest::SetMainBrand(const char* brand) {
@@ -427,7 +426,7 @@
 const char kAppListInstall[] = "C8I";
 const char kAppListSetToGoogle[] = "C8S";
 const char kAppListFirstSearch[] = "C8F";
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
+#elif BUILDFLAG(IS_CHROMEOS)
 const char kOmniboxInstall[] = "CAI";
 const char kOmniboxSetToGoogle[] = "CAS";
 const char kOmniboxFirstSearch[] = "CAF";
@@ -918,7 +917,7 @@
   EXPECT_STREQ(kOmniboxRlzString, base::UTF16ToUTF8(rlz).c_str());
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // By design, on Chrome OS the RLZ string can only be set once.  Once set,
 // pings cannot change int.
 TEST_F(RlzLibTest, PingUpdatesRlzCache) {
@@ -976,7 +975,7 @@
   EXPECT_STREQ(kNewAppListRlzString, base::UTF16ToUTF8(rlz).c_str());
 #endif  // !BUILDFLAG(IS_IOS)
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 // TODO(thakis): Reactivation doesn't exist on Mac yet.
 TEST_F(RlzLibTest, ReactivationNonOrganicNonOrganic) {
@@ -1022,7 +1021,7 @@
   ExpectReactivationRlzPingSent(false);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(RlzLibTest, ClearRlzState) {
   RLZTracker::RecordProductEvent(rlz_lib::CHROME, RLZTracker::ChromeOmnibox(),
                                  rlz_lib::FIRST_SEARCH);
@@ -1066,7 +1065,7 @@
                                  rlz_lib::FIRST_SEARCH);
   ExpectEventRecorded(OmniboxFirstSearch(), false);
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if !BUILDFLAG(IS_IOS)
 TEST_F(RlzLibTest, RecordChromeHomePageSearch) {
diff --git a/components/safe_browsing/content/common/file_type_policies_unittest.cc b/components/safe_browsing/content/common/file_type_policies_unittest.cc
index 210f7978..02b2805 100644
--- a/components/safe_browsing/content/common/file_type_policies_unittest.cc
+++ b/components/safe_browsing/content/common/file_type_policies_unittest.cc
@@ -146,8 +146,6 @@
   EXPECT_EQ(142, file_type.uma_value());
   EXPECT_FALSE(file_type.is_archive());
   EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting());
-// TODO(crbug.com/40118868): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
 #if BUILDFLAG(IS_LINUX)
   EXPECT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE,
             file_type.platform_settings(0).danger_level());
diff --git a/components/search_engines/BUILD.gn b/components/search_engines/BUILD.gn
index 5cc6ea4..9a2cf30 100644
--- a/components/search_engines/BUILD.gn
+++ b/components/search_engines/BUILD.gn
@@ -144,13 +144,6 @@
       "enterprise/site_search_policy_handler.h",
     ]
   }
-
-  if (is_chromeos_lacros) {
-    deps += [
-      "//chromeos/crosapi/mojom",
-      "//chromeos/lacros",
-    ]
-  }
 }
 
 source_set("search_engine_utils") {
diff --git a/components/search_engines/DEPS b/components/search_engines/DEPS
index 0190adb..f7728990 100644
--- a/components/search_engines/DEPS
+++ b/components/search_engines/DEPS
@@ -1,6 +1,4 @@
 include_rules = [
-  "+chromeos/lacros",
-  "+chromeos/crosapi/mojom",
   "+components/country_codes",
   "+components/database_utils",
   "+components/google/core",
diff --git a/components/search_engines/default_search_manager_unittest.cc b/components/search_engines/default_search_manager_unittest.cc
index 917d0df..d977e67 100644
--- a/components/search_engines/default_search_manager_unittest.cc
+++ b/components/search_engines/default_search_manager_unittest.cc
@@ -107,10 +107,6 @@
     return std::make_unique<DefaultSearchManager>(
         pref_service(), search_engine_choice_service(),
         DefaultSearchManager::ObserverCallback()
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-            ,
-        /*for_lacros_main_profile=*/false
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
     );
   }
 
diff --git a/components/search_engines/template_url_service.cc b/components/search_engines/template_url_service.cc
index e9ca75d4..4e682bc 100644
--- a/components/search_engines/template_url_service.cc
+++ b/components/search_engines/template_url_service.cc
@@ -374,12 +374,7 @@
     std::unique_ptr<SearchTermsData> search_terms_data,
     const scoped_refptr<KeywordWebDataService>& web_data_service,
     std::unique_ptr<TemplateURLServiceClient> client,
-    const base::RepeatingClosure& dsp_change_callback
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-    ,
-    bool for_lacros_main_profile
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-    )
+    const base::RepeatingClosure& dsp_change_callback)
     : prefs_(prefs),
       search_engine_choice_service_(search_engine_choice_service),
       search_terms_data_(std::move(search_terms_data)),
@@ -391,12 +386,7 @@
           &prefs,
           &search_engine_choice_service,
           base::BindRepeating(&TemplateURLService::ApplyDefaultSearchChange,
-                              base::Unretained(this))
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-              ,
-          for_lacros_main_profile
-#endif  //  BUILDFLAG(IS_CHROMEOS_LACROS)
-          ),
+                              base::Unretained(this))),
       enterprise_search_manager_(GetEnterpriseSearchManager(&prefs)) {
   DCHECK(search_terms_data_);
   Init();
@@ -412,12 +402,7 @@
           /*search_terms_data=*/std::make_unique<SearchTermsData>(),
           /*web_data_service=*/nullptr,
           /*client=*/nullptr,
-          /*dsp_change_callback=*/base::RepeatingClosure()
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-              ,
-          /*for_lacros_main_profile=*/false
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-      ) {
+          /*dsp_change_callback=*/base::RepeatingClosure()) {
   // This constructor is not intended to be used outside of tests.
   CHECK_IS_TEST();
   ApplyInitializersForTesting(initializers);  // IN-TEST
diff --git a/components/search_engines/template_url_service.h b/components/search_engines/template_url_service.h
index d141704..9f873d7 100644
--- a/components/search_engines/template_url_service.h
+++ b/components/search_engines/template_url_service.h
@@ -143,12 +143,7 @@
       std::unique_ptr<SearchTermsData> search_terms_data,
       const scoped_refptr<KeywordWebDataService>& web_data_service,
       std::unique_ptr<TemplateURLServiceClient> client,
-      const base::RepeatingClosure& dsp_change_callback
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-      ,
-      bool for_lacros_main_profile
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-  );
+      const base::RepeatingClosure& dsp_change_callback);
 
   // For testing only. `initializers` will be used to simulate having loaded
   // some template URL data.
diff --git a/components/search_engines/template_url_service_test_util.cc b/components/search_engines/template_url_service_test_util.cc
index 8e5fd91a..b9a0ce8 100644
--- a/components/search_engines/template_url_service_test_util.cc
+++ b/components/search_engines/template_url_service_test_util.cc
@@ -93,12 +93,7 @@
   return std::make_unique<TemplateURLService>(
       pref_service_, *search_engine_choice_service_,
       std::make_unique<SearchTermsData>(), nullptr /* KeywordWebDataService */,
-      nullptr /* TemplateURLServiceClient */, base::RepeatingClosure()
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-                                                  ,
-      false
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-  );
+      nullptr /* TemplateURLServiceClient */, base::RepeatingClosure());
 }
 
 // -- LoadedTemplateURLServiceUnitTestBase ------------------------------------
@@ -129,12 +124,7 @@
   auto template_url_service = std::make_unique<TemplateURLService>(
       pref_service(), search_engine_choice_service(),
       std::make_unique<SearchTermsData>(), keyword_data_service_,
-      nullptr /* TemplateURLServiceClient */, base::RepeatingClosure()
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-                                                  ,
-      false
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
-  );
+      nullptr /* TemplateURLServiceClient */, base::RepeatingClosure());
 
   return template_url_service;
 }
diff --git a/components/security_interstitials/content/BUILD.gn b/components/security_interstitials/content/BUILD.gn
index 5ce8495..11b8e2f 100644
--- a/components/security_interstitials/content/BUILD.gn
+++ b/components/security_interstitials/content/BUILD.gn
@@ -68,7 +68,6 @@
     ":proto",
     "//base",
     "//build:branding_buildflags",
-    "//build:chromeos_buildflags",
     "//components/captive_portal/core",
     "//components/content_settings/core/browser",
     "//components/content_settings/core/common",
@@ -150,7 +149,6 @@
     ":security_interstitial_page",
     "//base",
     "//base/test:test_support",
-    "//build:chromeos_buildflags",
     "//components/captive_portal/content",
     "//components/captive_portal/core:test_support",
     "//components/embedder_support",
diff --git a/components/security_interstitials/content/utils.cc b/components/security_interstitials/content/utils.cc
index 3670e0e..dda58b23 100644
--- a/components/security_interstitials/content/utils.cc
+++ b/components/security_interstitials/content/utils.cc
@@ -11,7 +11,6 @@
 #include "base/notreached.h"
 #include "base/process/launch.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 
 #if BUILDFLAG(IS_ANDROID)
 #include "base/android/jni_android.h"
@@ -31,14 +30,14 @@
 
 namespace security_interstitials {
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 void LaunchDateAndTimeSettings() {
 // The code for each OS is completely separate, in order to avoid bugs like
 // https://crbug.com/430877 .
 #if BUILDFLAG(IS_ANDROID)
   JNIEnv* env = base::android::AttachCurrentThread();
   Java_DateAndTimeSettingsHelper_openDateAndTimeSettings(env);
-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+#elif BUILDFLAG(IS_LINUX)
   struct ClockCommand {
     const char* const pathname;
     const char* const argument;
diff --git a/components/security_interstitials/content/utils.h b/components/security_interstitials/content/utils.h
index 23102467..efaace0 100644
--- a/components/security_interstitials/content/utils.h
+++ b/components/security_interstitials/content/utils.h
@@ -6,13 +6,12 @@
 #define COMPONENTS_SECURITY_INTERSTITIALS_CONTENT_UTILS_H_
 
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 
 namespace security_interstitials {
 
 // Provides utilities for security interstitials on //content-based platforms.
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // Launches date and time settings as appropriate based on the platform (not
 // supported on ChromeOS, where taking this action requires embedder-level
 // machinery.
diff --git a/components/segmentation_platform/internal/execution/model_executor_impl.cc b/components/segmentation_platform/internal/execution/model_executor_impl.cc
index d708dbb60..7e3f0a9 100644
--- a/components/segmentation_platform/internal/execution/model_executor_impl.cc
+++ b/components/segmentation_platform/internal/execution/model_executor_impl.cc
@@ -64,7 +64,7 @@
   SegmentId segment_id = SegmentId::OPTIMIZATION_TARGET_UNKNOWN;
   proto::ModelSource model_source = proto::ModelSource::DEFAULT_MODEL_SOURCE;
   int64_t model_version = 0;
-  raw_ptr<ModelProvider, AcrossTasksDanglingUntriaged> model_provider = nullptr;
+  raw_ptr<ModelProvider> model_provider = nullptr;
   bool record_metrics_for_default = false;
   ModelExecutionCallback callback;
   ModelProvider::Request input_tensor;
diff --git a/components/send_tab_to_self/entry_point_display_reason.cc b/components/send_tab_to_self/entry_point_display_reason.cc
index b162e47..503fccb 100644
--- a/components/send_tab_to_self/entry_point_display_reason.cc
+++ b/components/send_tab_to_self/entry_point_display_reason.cc
@@ -4,7 +4,6 @@
 
 #include "components/send_tab_to_self/entry_point_display_reason.h"
 
-#include "build/chromeos_buildflags.h"
 #include "components/prefs/pref_service.h"
 #include "components/send_tab_to_self/send_tab_to_self_model.h"
 #include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
@@ -20,15 +19,11 @@
 
 bool ShouldOfferSignin(syncer::SyncService* sync_service,
                        PrefService* pref_service) {
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  return false;
-#else
   return pref_service->GetBoolean(prefs::kSigninAllowed) &&
          sync_service->GetAccountInfo().IsEmpty() &&
          !sync_service->HasDisableReason(
              syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY) &&
          !sync_service->IsLocalSyncEnabled();
-#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 }
 
 }  // namespace
diff --git a/components/send_tab_to_self/entry_point_display_reason_unittest.cc b/components/send_tab_to_self/entry_point_display_reason_unittest.cc
index bb16d60..99c62231 100644
--- a/components/send_tab_to_self/entry_point_display_reason_unittest.cc
+++ b/components/send_tab_to_self/entry_point_display_reason_unittest.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-#include "build/chromeos_buildflags.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
@@ -69,15 +68,12 @@
   TestingPrefServiceSimple pref_service_;
 };
 
-// The promo isn't supported on Lacros yet.
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 TEST_F(EntryPointDisplayReasonTest, ShouldShowPromoIfSignedOut) {
   EXPECT_EQ(
       EntryPointDisplayReason::kOfferSignIn,
       GetEntryPointDisplayReason(GURL(kHttpsUrl), sync_service(),
                                  send_tab_to_self_model(), pref_service()));
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
 
 TEST_F(EntryPointDisplayReasonTest, ShouldHidePromoIfSyncDisabledByPolicy) {
   sync_service()->SetAllowedByEnterprisePolicy(false);
diff --git a/components/sessions/BUILD.gn b/components/sessions/BUILD.gn
index 6db298c..6179da7 100644
--- a/components/sessions/BUILD.gn
+++ b/components/sessions/BUILD.gn
@@ -136,7 +136,6 @@
 
   public_deps = [
     ":session_id",
-    "//build:chromeos_buildflags",
     "//components/keyed_service/core",
     "//skia",
   ]
diff --git a/components/sessions/core/session_types.h b/components/sessions/core/session_types.h
index aa5bcf1..1861d93 100644
--- a/components/sessions/core/session_types.h
+++ b/components/sessions/core/session_types.h
@@ -14,7 +14,6 @@
 
 #include "base/time/time.h"
 #include "base/token.h"
-#include "build/chromeos_buildflags.h"
 #include "components/sessions/core/serialized_navigation_entry.h"
 #include "components/sessions/core/serialized_user_agent_override.h"
 #include "components/sessions/core/session_id.h"
@@ -156,7 +155,7 @@
     TYPE_APP = 2,
     TYPE_DEVTOOLS = 3,
     TYPE_APP_POPUP = 4,
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     TYPE_CUSTOM_TAB = 5,
 #endif
   };
diff --git a/components/sessions/core/tab_restore_service_impl.cc b/components/sessions/core/tab_restore_service_impl.cc
index 2da47939..a9e12cc 100644
--- a/components/sessions/core/tab_restore_service_impl.cc
+++ b/components/sessions/core/tab_restore_service_impl.cc
@@ -253,7 +253,7 @@
     case sessions::SessionWindow::TYPE_APP:
     case sessions::SessionWindow::TYPE_DEVTOOLS:
     case sessions::SessionWindow::TYPE_APP_POPUP:
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     case sessions::SessionWindow::TYPE_CUSTOM_TAB:
 #endif
       *type = static_cast<sessions::SessionWindow::WindowType>(type_int);
diff --git a/components/soda/BUILD.gn b/components/soda/BUILD.gn
index d6b0266..a77a42e7 100644
--- a/components/soda/BUILD.gn
+++ b/components/soda/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//build/buildflag_header.gni")
-import("//build/config/chromeos/ui_mode.gni")
 import("//components/soda/buildflags.gni")
 
 assert(!is_android)
@@ -26,13 +25,12 @@
   deps = [
     ":constants",
     "//base",
-    "//build:chromeos_buildflags",
     "//components/live_caption:constants",
     "//components/prefs",
     "//media",
   ]
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     sources += [
       "soda_installer_impl_chromeos.cc",
       "soda_installer_impl_chromeos.h",
@@ -45,10 +43,6 @@
       "//ui/base",
     ]
   }
-
-  if (is_chromeos_lacros) {
-    deps += [ "//chromeos/startup:startup" ]
-  }
 }
 
 source_set("constants") {
@@ -85,18 +79,14 @@
     "//ui/base",
   ]
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     deps += [ "//ash/constants:constants" ]
   }
-
-  if (is_chromeos_lacros) {
-    deps += [ "//chromeos/startup:startup" ]
-  }
 }
 
 source_set("unit_tests") {
   testonly = true
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     sources = [ "soda_installer_impl_chromeos_unittest.cc" ]
 
     deps = [
diff --git a/components/soda/soda_features.cc b/components/soda/soda_features.cc
index 04c34dc0..8f1b20b 100644
--- a/components/soda/soda_features.cc
+++ b/components/soda/soda_features.cc
@@ -7,7 +7,7 @@
 #include "base/feature_list.h"
 
 namespace speech {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 BASE_FEATURE(kCrosExpandSodaLanguages,
              "CrosExpandSodaLanguages",
              base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/components/soda/soda_installer.cc b/components/soda/soda_installer.cc
index 4e13e66..474353f 100644
--- a/components/soda/soda_installer.cc
+++ b/components/soda/soda_installer.cc
@@ -12,7 +12,6 @@
 #include "base/observer_list.h"
 #include "base/strings/string_split.h"
 #include "base/values.h"
-#include "build/chromeos_buildflags.h"
 #include "components/live_caption/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
@@ -20,10 +19,10 @@
 #include "components/soda/pref_names.h"
 #include "media/base/media_switches.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 namespace {
 
@@ -41,10 +40,10 @@
 
 // static
 SodaInstaller* SodaInstaller::GetInstance() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   DCHECK(
       base::FeatureList::IsEnabled(ash::features::kOnDeviceSpeechRecognition));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
   return g_instance;
 }
 
@@ -63,7 +62,7 @@
   registry->RegisterTimePref(prefs::kSodaScheduledDeletionTime, base::Time());
   SodaInstaller::RegisterRegisteredLanguagePackPref(registry);
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   // Handle non-Chrome-OS logic here. We need to keep the implementation of this
   // method in the parent class to avoid duplicate declaration build errors
   // (specifically on Windows).
@@ -74,16 +73,16 @@
        kLanguageComponentConfigs) {
     registry->RegisterFilePathPref(config.config_path_pref, base::FilePath());
   }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 }
 
 void SodaInstaller::Init(PrefService* profile_prefs,
                          PrefService* global_prefs) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (!base::FeatureList::IsEnabled(
           ash::features::kOnDeviceSpeechRecognition) ||
       soda_installer_initialized_) {
-#else  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#else  // !BUILDFLAG(IS_CHROMEOS)
   if (soda_installer_initialized_) {
 #endif
     return;
@@ -301,13 +300,13 @@
 }
 
 bool SodaInstaller::IsAnyFeatureUsingSodaEnabled(PrefService* prefs) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   return prefs->GetBoolean(prefs::kLiveCaptionEnabled) ||
          prefs->GetBoolean(ash::prefs::kAccessibilityDictationEnabled) ||
          prefs->GetBoolean(ash::prefs::kProjectorCreationFlowEnabled) ||
          prefs->GetString(
              ash::prefs::kClassManagementToolsAvailabilitySetting) == "teacher";
-#else  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#else  // !BUILDFLAG(IS_CHROMEOS)
   return prefs->GetBoolean(prefs::kLiveCaptionEnabled);
 #endif
 }
diff --git a/components/soda/soda_util.cc b/components/soda/soda_util.cc
index 9f198e4..3cf720a 100644
--- a/components/soda/soda_util.cc
+++ b/components/soda/soda_util.cc
@@ -8,21 +8,16 @@
 
 #include "base/feature_list.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/soda/constants.h"
 #include "components/soda/soda_installer.h"
 #include "media/base/media_switches.h"
 #include "ui/base/l10n/l10n_util.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
 #include "base/feature_list.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "chromeos/startup/browser_params_proxy.h"
-#endif
-
 #if BUILDFLAG(IS_WIN)
 #include "base/win/windows_version.h"
 #endif
@@ -37,18 +32,9 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
 bool IsSupportedChromeOS() {
-// Some Chrome OS devices do not support on-device speech.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  if (!base::FeatureList::IsEnabled(
-          ash::features::kOnDeviceSpeechRecognition)) {
-    return false;
-  }
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  if (!chromeos::BrowserParamsProxy::Get()->IsOndeviceSpeechSupported()) {
-    return false;
-  }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-  return true;
+  // Some Chrome OS devices do not support on-device speech.
+  return base::FeatureList::IsEnabled(
+      ash::features::kOnDeviceSpeechRecognition);
 }
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
diff --git a/components/startup_metric_utils/browser/startup_metric_utils.cc b/components/startup_metric_utils/browser/startup_metric_utils.cc
index 88ff5b9..576b9e0 100644
--- a/components/startup_metric_utils/browser/startup_metric_utils.cc
+++ b/components/startup_metric_utils/browser/startup_metric_utils.cc
@@ -14,6 +14,7 @@
 
 #include <optional>
 #include <string>
+#include <string_view>
 #include <type_traits>
 #include <vector>
 
@@ -22,6 +23,7 @@
 #include "base/location.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
+#include "base/strings/strcat.h"
 #include "base/threading/scoped_thread_priority.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
@@ -134,19 +136,21 @@
 // This function must only be used in code that runs after
 // |g_startup_temperature| has been initialized.
 template <typename T>
-void EmitHistogramWithTemperature(
-    void (*histogram_function)(const std::string& name, T),
-    const std::string& histogram_basename,
-    T value) {
+void EmitHistogramWithTemperature(void (*histogram_function)(std::string_view,
+                                                             T),
+                                  std::string_view histogram_basename,
+                                  T value) {
   // Always record to the base histogram.
   (*histogram_function)(histogram_basename, value);
   // Record to the cold/warm suffixed histogram as appropriate.
   switch (g_startup_temperature) {
     case COLD_STARTUP_TEMPERATURE:
-      (*histogram_function)(histogram_basename + ".ColdStartup", value);
+      (*histogram_function)(base::StrCat({histogram_basename, ".ColdStartup"}),
+                            value);
       break;
     case WARM_STARTUP_TEMPERATURE:
-      (*histogram_function)(histogram_basename + ".WarmStartup", value);
+      (*histogram_function)(base::StrCat({histogram_basename, ".WarmStartup"}),
+                            value);
       break;
     case LUKEWARM_STARTUP_TEMPERATURE:
       // No suffix emitted for lukewarm startups.
@@ -163,7 +167,7 @@
 namespace startup_metric_utils {
 
 void BrowserStartupMetricRecorder::EmitHistogramWithTemperatureAndTraceEvent(
-    void (*histogram_function)(const std::string& name, base::TimeDelta),
+    void (*histogram_function)(std::string_view, base::TimeDelta),
     const char* histogram_basename,
     base::TimeTicks begin_ticks,
     base::TimeTicks end_ticks) {
diff --git a/components/startup_metric_utils/browser/startup_metric_utils.h b/components/startup_metric_utils/browser/startup_metric_utils.h
index ce17cdf..3600976 100644
--- a/components/startup_metric_utils/browser/startup_metric_utils.h
+++ b/components/startup_metric_utils/browser/startup_metric_utils.h
@@ -164,7 +164,7 @@
   base::TimeTicks GetWebContentsStartTicks() const;
 
   void EmitHistogramWithTemperatureAndTraceEvent(
-      void (*histogram_function)(const std::string& name, base::TimeDelta),
+      void (*histogram_function)(std::string_view name, base::TimeDelta),
       const char* histogram_basename,
       base::TimeTicks begin_ticks,
       base::TimeTicks end_ticks);
diff --git a/components/startup_metric_utils/common/startup_metric_utils.h b/components/startup_metric_utils/common/startup_metric_utils.h
index 44c184d6b..e7f81507 100644
--- a/components/startup_metric_utils/common/startup_metric_utils.h
+++ b/components/startup_metric_utils/common/startup_metric_utils.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_STARTUP_METRIC_UTILS_COMMON_STARTUP_METRIC_UTILS_H_
 #define COMPONENTS_STARTUP_METRIC_UTILS_COMMON_STARTUP_METRIC_UTILS_H_
 
+#include <string_view>
+
 #include "base/component_export.h"
 #include "base/containers/flat_set.h"
 #include "base/dcheck_is_on.h"
@@ -91,7 +93,7 @@
   //         "Startup.LoadTime.ApplicationStartToChromeMain",
   //         GetCommon().application_start_ticks_,
   //         GetCommon().chrome_main_entry_ticks_);
-  using HistogramTimeFunction = void(const char* name, base::TimeDelta);
+  using HistogramTimeFunction = void(std::string_view name, base::TimeDelta);
   void EmitHistogramWithTraceEvent(HistogramTimeFunction* histogram_function,
                                    const char* name,
                                    base::TimeTicks begin_ticks,
diff --git a/components/storage_monitor/BUILD.gn b/components/storage_monitor/BUILD.gn
index c6bbb5e..3cce5f29 100644
--- a/components/storage_monitor/BUILD.gn
+++ b/components/storage_monitor/BUILD.gn
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/chromeos/ui_mode.gni")
 import("//build/config/features.gni")
 
 static_library("storage_monitor") {
@@ -22,7 +21,6 @@
 
   deps = [
     "//base",
-    "//build:chromeos_buildflags",
     "//content/public/browser",
     "//mojo/public/cpp/bindings",
     "//services/service_manager/public/cpp",
@@ -53,9 +51,7 @@
       "ImageCaptureCore.framework",
       "UniformTypeIdentifiers.framework",
     ]
-  } else if (is_chromeos_ash) {
-    # For Chrome OS, |is_linux| is also true. Put this in an else-if block above
-    # the |is_linux| else-if block, so they do not clash.
+  } else if (is_chromeos) {
     sources += [
       "storage_monitor_chromeos.cc",
       "storage_monitor_chromeos.h",
@@ -74,7 +70,7 @@
       ]
       deps += [ "//services/device/public/mojom" ]
     }
-  } else if (is_linux || is_chromeos_lacros) {
+  } else if (is_linux) {
     if (use_udev) {
       sources += [
         "mtab_watcher_linux.cc",
@@ -117,9 +113,9 @@
     "//content/public/browser",
   ]
 
-  deps = [ "//build:chromeos_buildflags" ]
+  deps = []
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     sources += [
       "test_media_transfer_protocol_manager_chromeos.cc",
       "test_media_transfer_protocol_manager_chromeos.h",
@@ -169,7 +165,8 @@
     frameworks = [ "UniformTypeIdentifiers.framework" ]
   }
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
+    deps += [ "//chromeos/ash/components/disks:test_support" ]
     if (use_dbus) {
       deps += [
         "//services/device/public/mojom",
@@ -180,12 +177,9 @@
         "storage_monitor_chromeos_unittest.cc",
       ]
     }
-  } else if (is_linux || is_chromeos_lacros) {
+  } else if (is_linux) {
     if (use_udev) {
       sources += [ "storage_monitor_linux_unittest.cc" ]
     }
   }
-  if (is_chromeos_ash) {
-    deps += [ "//chromeos/ash/components/disks:test_support" ]
-  }
 }
diff --git a/components/storage_monitor/mtab_watcher_linux.h b/components/storage_monitor/mtab_watcher_linux.h
index 69687f6..0f1fabe 100644
--- a/components/storage_monitor/mtab_watcher_linux.h
+++ b/components/storage_monitor/mtab_watcher_linux.h
@@ -5,12 +5,6 @@
 #ifndef COMPONENTS_STORAGE_MONITOR_MTAB_WATCHER_LINUX_H_
 #define COMPONENTS_STORAGE_MONITOR_MTAB_WATCHER_LINUX_H_
 
-#include "build/chromeos_buildflags.h"
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#error "ChromeOS does not use MtabWatcherLinux."
-#endif
-
 #include <map>
 
 #include "base/files/file_path.h"
@@ -19,6 +13,10 @@
 #include "base/sequence_checker.h"
 #include "build/build_config.h"
 
+#if BUILDFLAG(IS_CHROMEOS)
+#error "ChromeOS does not use MtabWatcherLinux."
+#endif
+
 namespace storage_monitor {
 
 // MtabWatcherLinux listens for mount point changes from a mtab file and
diff --git a/components/storage_monitor/storage_monitor.h b/components/storage_monitor/storage_monitor.h
index 6ec8a352..71680e1 100644
--- a/components/storage_monitor/storage_monitor.h
+++ b/components/storage_monitor/storage_monitor.h
@@ -16,10 +16,9 @@
 #include "base/sequence_checker.h"
 #include "base/synchronization/lock.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/storage_monitor/storage_info.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "services/device/public/mojom/mtp_manager.mojom-forward.h"
 #endif
 
@@ -120,7 +119,7 @@
       std::wstring* storage_object_id) const = 0;
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   virtual device::mojom::MtpManager* media_transfer_protocol_manager() = 0;
 #endif
 
diff --git a/components/storage_monitor/storage_monitor_chromeos.h b/components/storage_monitor/storage_monitor_chromeos.h
index 431bacc..68ede46 100644
--- a/components/storage_monitor/storage_monitor_chromeos.h
+++ b/components/storage_monitor/storage_monitor_chromeos.h
@@ -9,12 +9,6 @@
 #ifndef COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_CHROMEOS_H_
 #define COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_CHROMEOS_H_
 
-#include "build/chromeos_buildflags.h"
-
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
-#error "Should only be used on ChromeOS."
-#endif
-
 #include <map>
 #include <memory>
 #include <string>
@@ -27,6 +21,10 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/mtp_manager.mojom.h"
 
+#if !BUILDFLAG(IS_CHROMEOS)
+#error "Should only be used on ChromeOS."
+#endif
+
 namespace storage_monitor {
 
 class MtpManagerClientChromeOS;
diff --git a/components/storage_monitor/storage_monitor_linux.h b/components/storage_monitor/storage_monitor_linux.h
index aa6ac9b8..3657e2c 100644
--- a/components/storage_monitor/storage_monitor_linux.h
+++ b/components/storage_monitor/storage_monitor_linux.h
@@ -10,12 +10,6 @@
 #ifndef COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_LINUX_H_
 #define COMPONENTS_STORAGE_MONITOR_STORAGE_MONITOR_LINUX_H_
 
-#include "build/chromeos_buildflags.h"
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#error "Use the ChromeOS-specific implementation instead."
-#endif
-
 #include <map>
 #include <memory>
 #include <string>
@@ -29,6 +23,10 @@
 #include "components/storage_monitor/mtab_watcher_linux.h"
 #include "components/storage_monitor/storage_monitor.h"
 
+#if BUILDFLAG(IS_CHROMEOS)
+#error "Use the ChromeOS-specific implementation instead."
+#endif
+
 namespace base {
 class SequencedTaskRunner;
 }
diff --git a/components/storage_monitor/test_storage_monitor.cc b/components/storage_monitor/test_storage_monitor.cc
index e388b368..8a68e60 100644
--- a/components/storage_monitor/test_storage_monitor.cc
+++ b/components/storage_monitor/test_storage_monitor.cc
@@ -10,17 +10,16 @@
 #include "base/run_loop.h"
 #include "base/synchronization/waitable_event.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/storage_monitor/storage_info.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "components/storage_monitor/test_media_transfer_protocol_manager_chromeos.h"
 #endif
 
 namespace storage_monitor {
 
 TestStorageMonitor::TestStorageMonitor() : init_called_(false) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   auto* fake_mtp_manager =
       TestMediaTransferProtocolManagerChromeOS::GetFakeMtpManager();
   fake_mtp_manager->AddReceiver(
@@ -115,7 +114,7 @@
 }
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 device::mojom::MtpManager*
 TestStorageMonitor::media_transfer_protocol_manager() {
   return media_transfer_protocol_manager_.get();
diff --git a/components/storage_monitor/test_storage_monitor.h b/components/storage_monitor/test_storage_monitor.h
index 0b4593de..e12b5de2 100644
--- a/components/storage_monitor/test_storage_monitor.h
+++ b/components/storage_monitor/test_storage_monitor.h
@@ -10,10 +10,9 @@
 #include <vector>
 
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/storage_monitor/storage_monitor.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/mtp_manager.mojom.h"
 #endif
@@ -53,7 +52,7 @@
       std::wstring* storage_object_id) const override;
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   device::mojom::MtpManager* media_transfer_protocol_manager() override;
 #endif
 
@@ -79,7 +78,7 @@
   // Paths considered for testing purposes to be on removable storage.
   std::vector<base::FilePath> removable_paths_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   mojo::Remote<device::mojom::MtpManager> media_transfer_protocol_manager_;
 #endif
 };
diff --git a/components/supervised_user/core/browser/child_account_service.cc b/components/supervised_user/core/browser/child_account_service.cc
index bf25357..1dc5141 100644
--- a/components/supervised_user/core/browser/child_account_service.cc
+++ b/components/supervised_user/core/browser/child_account_service.cc
@@ -14,7 +14,6 @@
 #include "base/no_destructor.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/policy/core/common/policy_pref_names.h"
 #include "components/signin/public/base/consent_level.h"
 #include "components/signin/public/base/signin_switches.h"
diff --git a/components/supervised_user/core/browser/list_family_members_service_unittest.cc b/components/supervised_user/core/browser/list_family_members_service_unittest.cc
index f79ba93..ad625a4 100644
--- a/components/supervised_user/core/browser/list_family_members_service_unittest.cc
+++ b/components/supervised_user/core/browser/list_family_members_service_unittest.cc
@@ -360,8 +360,6 @@
   test_list_family_members_service_->Shutdown();
 }
 
-// Sign-out test is not supported for ChromeOS
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
 // Data cleanup is only available for Windows, Mac and Linux
 #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
 TEST_F(ListFamilyMembersServiceTest, ListFamilyFetcherClearsResponseOnSignout) {
@@ -454,7 +452,6 @@
   test_list_family_members_service_->Shutdown();
 }
 #endif  // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 
 }  // namespace
 }  // namespace supervised_user
diff --git a/components/supervised_user/core/browser/supervised_user_url_filter.h b/components/supervised_user/core/browser/supervised_user_url_filter.h
index 4794f569..6b5bd9f 100644
--- a/components/supervised_user/core/browser/supervised_user_url_filter.h
+++ b/components/supervised_user/core/browser/supervised_user_url_filter.h
@@ -14,7 +14,6 @@
 #include "base/functional/callback_forward.h"
 #include "base/observer_list.h"
 #include "base/sequence_checker.h"
-#include "build/chromeos_buildflags.h"
 #include "components/safe_search_api/url_checker.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/supervised_user/core/browser/supervised_user_error_page.h"
diff --git a/components/sync_preferences/BUILD.gn b/components/sync_preferences/BUILD.gn
index 6667fcf..575b4e84 100644
--- a/components/sync_preferences/BUILD.gn
+++ b/components/sync_preferences/BUILD.gn
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/chromeos/ui_mode.gni")
 import("//build/config/features.gni")
 
 static_library("sync_preferences") {
@@ -27,7 +26,6 @@
 
   deps = [
     "//base",
-    "//build:chromeos_buildflags",
     "//components/metrics/demographics",
     "//components/policy/core/browser",
     "//components/pref_registry",
@@ -35,7 +33,7 @@
     "//components/sync",
   ]
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     deps += [ "//ash/constants" ]
   }
 }
@@ -104,7 +102,6 @@
     ":sync_preferences",
     ":test_support",
     "//base/test:test_support",
-    "//build:chromeos_buildflags",
     "//components/pref_registry",
     "//components/prefs",
     "//components/prefs:test_support",
@@ -113,7 +110,7 @@
     "//testing/gtest",
   ]
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     deps += [ "//ash/constants" ]
   }
 }
diff --git a/components/sync_preferences/common_syncable_prefs_database.cc b/components/sync_preferences/common_syncable_prefs_database.cc
index 5ecd85d..53d0e65 100644
--- a/components/sync_preferences/common_syncable_prefs_database.cc
+++ b/components/sync_preferences/common_syncable_prefs_database.cc
@@ -274,7 +274,7 @@
           PrefSensitivity::kNone, MergeBehavior::kNone}},
 // For Ash, the OS_PRIORITY_PREFERENCES equivalent is defined in
 // chrome/browser/sync/prefs/chrome_syncable_prefs_database.cc instead.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
         {variations::kDogfoodGroupsSyncPrefName,
          {syncable_prefs_ids::kDogfoodGroupsSyncPrefName,
           syncer::PRIORITY_PREFERENCES, PrefSensitivity::kNone,
diff --git a/components/sync_preferences/dual_layer_user_pref_store.cc b/components/sync_preferences/dual_layer_user_pref_store.cc
index 3a4685b..313cf0e5 100644
--- a/components/sync_preferences/dual_layer_user_pref_store.cc
+++ b/components/sync_preferences/dual_layer_user_pref_store.cc
@@ -15,7 +15,6 @@
 #include "base/observer_list.h"
 #include "base/strings/string_util.h"
 #include "base/values.h"
-#include "build/chromeos_buildflags.h"
 #include "components/sync/service/sync_service.h"
 #include "components/sync/service/sync_user_settings.h"
 #include "components/sync_preferences/pref_model_associator_client.h"
diff --git a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
index 6120a0f..37adf0c1 100644
--- a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
+++ b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/test/mock_callback.h"
 #include "base/test/task_environment.h"
 #include "base/values.h"
-#include "build/chromeos_buildflags.h"
 #include "components/prefs/testing_pref_store.h"
 #include "components/sync/test/test_sync_service.h"
 #include "components/sync_preferences/pref_model_associator_client.h"
@@ -189,7 +188,7 @@
     // data types appropriately.
     dual_layer_store_->EnableType(syncer::PREFERENCES);
     dual_layer_store_->EnableType(syncer::PRIORITY_PREFERENCES);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     dual_layer_store_->EnableType(syncer::OS_PREFERENCES);
     dual_layer_store_->EnableType(syncer::OS_PRIORITY_PREFERENCES);
 #endif
@@ -1257,7 +1256,7 @@
 
     dual_layer_store_->EnableType(syncer::PREFERENCES);
     dual_layer_store_->EnableType(syncer::PRIORITY_PREFERENCES);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     dual_layer_store_->EnableType(syncer::OS_PREFERENCES);
     dual_layer_store_->EnableType(syncer::OS_PRIORITY_PREFERENCES);
 #endif
diff --git a/components/sync_preferences/pref_model_associator.cc b/components/sync_preferences/pref_model_associator.cc
index 68820d7..790889b 100644
--- a/components/sync_preferences/pref_model_associator.cc
+++ b/components/sync_preferences/pref_model_associator.cc
@@ -22,7 +22,6 @@
 #include "base/observer_list.h"
 #include "base/types/expected_macros.h"
 #include "base/values.h"
-#include "build/chromeos_buildflags.h"
 #include "components/sync/base/data_type.h"
 #include "components/sync/base/features.h"
 #include "components/sync/model/sync_change.h"
@@ -43,7 +42,7 @@
       return pref.GetSpecifics().preference();
     case syncer::PRIORITY_PREFERENCES:
       return pref.GetSpecifics().priority_preference().preference();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     case syncer::OS_PREFERENCES:
       return pref.GetSpecifics().os_preference().preference();
     case syncer::OS_PRIORITY_PREFERENCES:
@@ -77,7 +76,7 @@
       user_prefs_(user_prefs),
       dual_layer_user_prefs_(nullptr) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   DCHECK(type_ == syncer::PREFERENCES ||
          type_ == syncer::PRIORITY_PREFERENCES ||
          type_ == syncer::OS_PREFERENCES ||
@@ -119,7 +118,7 @@
       return specifics->mutable_preference();
     case syncer::PRIORITY_PREFERENCES:
       return specifics->mutable_priority_preference()->mutable_preference();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     case syncer::OS_PREFERENCES:
       return specifics->mutable_os_preference()->mutable_preference();
     case syncer::OS_PRIORITY_PREFERENCES:
diff --git a/components/sync_preferences/pref_model_associator_unittest.cc b/components/sync_preferences/pref_model_associator_unittest.cc
index e7e3fc97..42594826 100644
--- a/components/sync_preferences/pref_model_associator_unittest.cc
+++ b/components/sync_preferences/pref_model_associator_unittest.cc
@@ -44,10 +44,10 @@
 const char kCustomMergePrefName[] = "pref.custom";
 
 const char kStringPriorityPrefName[] = "priority.pref.string";
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 const char kStringOsPrefName[] = "os.pref.string";
 const char kStringOsPriorityPrefName[] = "os.priority.pref.string";
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Assigning an id of 0 to all the test prefs.
 const TestSyncablePrefsDatabase::PrefsMap kSyncablePrefsDatabase = {
@@ -64,13 +64,13 @@
     {kStringPriorityPrefName,
      {0, syncer::PRIORITY_PREFERENCES, PrefSensitivity::kNone,
       MergeBehavior::kNone}},
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     {kStringOsPrefName,
      {0, syncer::OS_PREFERENCES, PrefSensitivity::kNone, MergeBehavior::kNone}},
     {kStringOsPriorityPrefName,
      {0, syncer::OS_PRIORITY_PREFERENCES, PrefSensitivity::kNone,
       MergeBehavior::kNone}},
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 };
 
 // Creates SyncData for a remote pref change.
@@ -597,7 +597,7 @@
               NotNull());
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(SyncablePrefsDatabaseTest, ShouldAllowRegisteringSyncableOSPrefs) {
   pref_registry_->RegisterStringPref(
       kStringOsPrefName, std::string(),
@@ -660,7 +660,7 @@
       kExpectedErrorMessageHint);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(SyncablePrefsDatabaseDeathTest, ShouldFailRegisteringIllegalOSPrefs) {
   const std::string kIllegalStringPrefName = "not-allowed_string_pref";
   const std::string kIllegalListPrefName = "not-allowed_list_pref";
@@ -721,7 +721,7 @@
                                kStringPriorityPrefName, std::string(),
                                user_prefs::PrefRegistrySyncable::SYNCABLE_PREF),
                            kExpectedErrorMessageHint);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   EXPECT_DCHECK_DEATH_WITH(
       pref_registry_->RegisterStringPref(
           kStringOsPrefName, std::string(),
diff --git a/components/sync_preferences/pref_service_syncable.cc b/components/sync_preferences/pref_service_syncable.cc
index 329a77a..4430d97e 100644
--- a/components/sync_preferences/pref_service_syncable.cc
+++ b/components/sync_preferences/pref_service_syncable.cc
@@ -12,7 +12,6 @@
 #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"
@@ -27,7 +26,7 @@
 #include "components/sync_preferences/pref_service_syncable_observer.h"
 #include "components/sync_preferences/synced_pref_observer.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
 #endif
 
@@ -92,7 +91,7 @@
       priority_pref_sync_associator_(pref_model_associator_client,
                                      user_prefs,
                                      syncer::PRIORITY_PREFERENCES),
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       os_pref_sync_associator_(pref_model_associator_client,
                                user_prefs,
                                syncer::OS_PREFERENCES),
@@ -127,7 +126,7 @@
       priority_pref_sync_associator_(pref_model_associator_client,
                                      dual_layer_user_prefs,
                                      syncer::PRIORITY_PREFERENCES),
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       os_pref_sync_associator_(pref_model_associator_client,
                                dual_layer_user_prefs,
                                syncer::OS_PREFERENCES),
@@ -145,7 +144,7 @@
 void PrefServiceSyncable::ConnectAssociatorsAndRegisterPreferences() {
   pref_sync_associator_.SetPrefService(this);
   priority_pref_sync_associator_.SetPrefService(this);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   os_pref_sync_associator_.SetPrefService(this);
   os_priority_pref_sync_associator_.SetPrefService(this);
 #endif
@@ -213,7 +212,7 @@
   return priority_pref_sync_associator_.models_associated();
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 bool PrefServiceSyncable::AreOsPrefsSyncing() {
   return os_pref_sync_associator_.models_associated();
 }
@@ -221,7 +220,7 @@
 bool PrefServiceSyncable::AreOsPriorityPrefsSyncing() {
   return os_priority_pref_sync_associator_.models_associated();
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 void PrefServiceSyncable::AddObserver(PrefServiceSyncableObserver* observer) {
   observer_list_.AddObserver(observer);
@@ -239,7 +238,7 @@
       return &pref_sync_associator_;
     case syncer::PRIORITY_PREFERENCES:
       return &priority_pref_sync_associator_;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     case syncer::OS_PREFERENCES:
       return &os_pref_sync_associator_;
     case syncer::OS_PRIORITY_PREFERENCES:
@@ -262,7 +261,7 @@
                                                 SyncedPrefObserver* observer) {
   pref_sync_associator_.AddSyncedPrefObserver(name, observer);
   priority_pref_sync_associator_.AddSyncedPrefObserver(name, observer);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   os_pref_sync_associator_.AddSyncedPrefObserver(name, observer);
   os_priority_pref_sync_associator_.AddSyncedPrefObserver(name, observer);
 #endif
@@ -273,7 +272,7 @@
     SyncedPrefObserver* observer) {
   pref_sync_associator_.RemoveSyncedPrefObserver(name, observer);
   priority_pref_sync_associator_.RemoveSyncedPrefObserver(name, observer);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   os_pref_sync_associator_.RemoveSyncedPrefObserver(name, observer);
   os_priority_pref_sync_associator_.RemoveSyncedPrefObserver(name, observer);
 #endif
@@ -290,7 +289,7 @@
     priority_pref_sync_associator_.RegisterPref(path);
     return;
   }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (flags & user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF) {
     os_pref_sync_associator_.RegisterPref(path);
     return;
diff --git a/components/sync_preferences/pref_service_syncable.h b/components/sync_preferences/pref_service_syncable.h
index c0c9f01..c670c1c 100644
--- a/components/sync_preferences/pref_service_syncable.h
+++ b/components/sync_preferences/pref_service_syncable.h
@@ -15,7 +15,6 @@
 #include "base/functional/callback_forward.h"
 #include "base/functional/callback_helpers.h"
 #include "base/observer_list.h"
-#include "build/chromeos_buildflags.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_service.h"
 #include "components/sync_preferences/pref_model_associator.h"
@@ -95,7 +94,7 @@
   // priority preferences.
   bool IsPrioritySyncing();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // As above, but for OS preferences.
   bool AreOsPrefsSyncing();
 
@@ -138,7 +137,7 @@
   PrefModelAssociator pref_sync_associator_;
   PrefModelAssociator priority_pref_sync_associator_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Associators for Chrome OS system preferences.
   PrefModelAssociator os_pref_sync_associator_;
   PrefModelAssociator os_priority_pref_sync_associator_;
diff --git a/components/sync_preferences/pref_service_syncable_unittest.cc b/components/sync_preferences/pref_service_syncable_unittest.cc
index 00bbb3b..7e4262db 100644
--- a/components/sync_preferences/pref_service_syncable_unittest.cc
+++ b/components/sync_preferences/pref_service_syncable_unittest.cc
@@ -16,7 +16,6 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/values.h"
-#include "build/chromeos_buildflags.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_notifier_impl.h"
 #include "components/prefs/scoped_user_pref_update.h"
@@ -41,7 +40,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "testing/gmock/include/gmock/gmock-matchers.h"
 #endif
 
@@ -74,7 +73,7 @@
 const char kDefaultCharsetValue[] = "utf-8";
 const char kBrowserPrefName[] = "browser_pref";
 const char kBrowserPriorityPrefName[] = "browser_priority_pref";
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 const char kOsPrefName[] = "os_pref";
 const char kOsPriorityPrefName[] = "os_priority_pref";
 #endif
@@ -101,7 +100,7 @@
     {kBrowserPriorityPrefName,
      {8, syncer::PRIORITY_PREFERENCES, PrefSensitivity::kNone,
       MergeBehavior::kNone}},
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     {kOsPrefName,
      {9, syncer::OS_PREFERENCES, PrefSensitivity::kNone, MergeBehavior::kNone}},
     {kOsPriorityPrefName,
@@ -129,7 +128,7 @@
   return std::nullopt;
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 constexpr DataTypeSet kAllPreferenceDataTypes = {
     syncer::PREFERENCES, syncer::PRIORITY_PREFERENCES, syncer::OS_PREFERENCES,
     syncer::OS_PRIORITY_PREFERENCES};
@@ -138,7 +137,7 @@
   const syncer::SyncChange& sync_change = arg;
   return Matches(data_type)(sync_change.sync_data().GetDataType());
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 class TestSyncProcessorStub : public syncer::SyncChangeProcessor {
  public:
@@ -991,7 +990,7 @@
   EXPECT_TRUE(pref->IsDefaultValue());
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // The Chrome OS tests exercise pref model association that happens in the
 // constructor of PrefServiceSyncable. The tests must register prefs first,
 // then create the PrefServiceSyncable object. The tests live in this file
@@ -1391,7 +1390,7 @@
   }
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 class PrefServiceSyncableFactoryTest : public PrefServiceSyncableTest {
  public:
@@ -1421,7 +1420,7 @@
       static_cast<PrefModelAssociator*>(
           pref_service->GetSyncableService(syncer::PRIORITY_PREFERENCES))
           ->IsUsingDualLayerUserPrefStoreForTesting());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   EXPECT_FALSE(static_cast<PrefModelAssociator*>(
                    pref_service->GetSyncableService(syncer::OS_PREFERENCES))
                    ->IsUsingDualLayerUserPrefStoreForTesting());
@@ -1445,7 +1444,7 @@
       static_cast<PrefModelAssociator*>(
           pref_service->GetSyncableService(syncer::PRIORITY_PREFERENCES))
           ->IsUsingDualLayerUserPrefStoreForTesting());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   EXPECT_TRUE(static_cast<PrefModelAssociator*>(
                   pref_service->GetSyncableService(syncer::OS_PREFERENCES))
                   ->IsUsingDualLayerUserPrefStoreForTesting());
diff --git a/components/sync_preferences/syncable_prefs_database.cc b/components/sync_preferences/syncable_prefs_database.cc
index aa71d31..9c97b08 100644
--- a/components/sync_preferences/syncable_prefs_database.cc
+++ b/components/sync_preferences/syncable_prefs_database.cc
@@ -7,7 +7,6 @@
 #include <string_view>
 
 #include "base/logging.h"
-#include "build/chromeos_buildflags.h"
 
 namespace sync_preferences {
 
diff --git a/components/sync_preferences/syncable_prefs_database.h b/components/sync_preferences/syncable_prefs_database.h
index f127c7a..f8dfbbac 100644
--- a/components/sync_preferences/syncable_prefs_database.h
+++ b/components/sync_preferences/syncable_prefs_database.h
@@ -11,7 +11,6 @@
 
 #include "base/check.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/sync/base/data_type.h"
 
 namespace sync_preferences {
@@ -56,10 +55,10 @@
         merge_behaviour_(merge_behavior) {
     CHECK(data_type_ == syncer::PREFERENCES ||
           data_type_ == syncer::PRIORITY_PREFERENCES
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
           || data_type_ == syncer::OS_PREFERENCES ||
           data_type_ == syncer::OS_PRIORITY_PREFERENCES
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
           )
         << "Invalid type " << data_type_
         << " for syncable pref with id=" << syncable_pref_id_;
diff --git a/components/system_media_controls/linux/buildflags/buildflags.gni b/components/system_media_controls/linux/buildflags/buildflags.gni
index 693bed3..539eea3 100644
--- a/components/system_media_controls/linux/buildflags/buildflags.gni
+++ b/components/system_media_controls/linux/buildflags/buildflags.gni
@@ -2,11 +2,10 @@
 # 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")
 import("//build/config/features.gni")
 
 declare_args() {
   # Enables Chromium implementation of the MPRIS D-Bus interface for controlling
   # media playback. See ../README.md for details.
-  use_mpris = (is_linux || is_chromeos_lacros) && use_dbus
+  use_mpris = is_linux && use_dbus
 }
diff --git a/components/translate/core/browser/BUILD.gn b/components/translate/core/browser/BUILD.gn
index 5510f453..1063102 100644
--- a/components/translate/core/browser/BUILD.gn
+++ b/components/translate/core/browser/BUILD.gn
@@ -51,7 +51,6 @@
   deps = [
     "//base",
     "//base:i18n",
-    "//build:chromeos_buildflags",
     "//components/assist_ranker",
     "//components/assist_ranker/proto",
     "//components/keyed_service/core",
@@ -111,7 +110,6 @@
     ":browser",
     ":test_support",
     "//base",
-    "//build:chromeos_buildflags",
     "//components/assist_ranker",
     "//components/assist_ranker/proto",
     "//components/infobars/core",
@@ -154,7 +152,6 @@
   ]
   deps = [
     "//base",
-    "//build:chromeos_buildflags",
     "//components/infobars/core",
     "//components/language/core/browser",
     "//components/sync_preferences",
diff --git a/components/translate/core/browser/mock_translate_client.cc b/components/translate/core/browser/mock_translate_client.cc
index db697642..ff046fb 100644
--- a/components/translate/core/browser/mock_translate_client.cc
+++ b/components/translate/core/browser/mock_translate_client.cc
@@ -4,7 +4,6 @@
 
 #include <memory>
 
-#include "build/chromeos_buildflags.h"
 #include "components/translate/core/browser/mock_translate_client.h"
 #include "components/translate/core/browser/translate_prefs.h"
 
@@ -12,7 +11,7 @@
 
 namespace testing {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 const char* preferred_languages_prefs = "settings.language.preferred_languages";
 #else
 const char* preferred_languages_prefs = nullptr;
diff --git a/components/translate/core/browser/translate_infobar_delegate_unittest.cc b/components/translate/core/browser/translate_infobar_delegate_unittest.cc
index ea310f40..4071b76 100644
--- a/components/translate/core/browser/translate_infobar_delegate_unittest.cc
+++ b/components/translate/core/browser/translate_infobar_delegate_unittest.cc
@@ -8,7 +8,6 @@
 #include <vector>
 
 #include "base/test/task_environment.h"
-#include "build/chromeos_buildflags.h"
 #include "components/infobars/core/infobar.h"
 #include "components/infobars/core/infobar_manager.h"
 #include "components/language/core/browser/accept_languages_service.h"
@@ -105,7 +104,7 @@
     language::LanguagePrefs::RegisterProfilePrefs(pref_service_->registry());
     pref_service_->SetString(testing::accept_languages_prefs, std::string());
     pref_service_->SetString(language::prefs::kAcceptLanguages, std::string());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     pref_service_->SetString(language::prefs::kPreferredLanguages,
                              std::string());
 #endif
@@ -290,7 +289,7 @@
   base::Value::List& update_list = update.Get();
   update_list.Append(kSourceLanguage);
   pref_service_->SetString(language::prefs::kAcceptLanguages, kSourceLanguage);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   pref_service_->SetString(language::prefs::kPreferredLanguages,
                            kSourceLanguage);
 #endif
diff --git a/components/translate/core/browser/translate_manager_unittest.cc b/components/translate/core/browser/translate_manager_unittest.cc
index bf0c1d1..9b428f1 100644
--- a/components/translate/core/browser/translate_manager_unittest.cc
+++ b/components/translate/core/browser/translate_manager_unittest.cc
@@ -15,7 +15,6 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/infobars/core/infobar.h"
 #include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/language_model.h"
@@ -125,7 +124,7 @@
       sync_preferences::TestingPrefServiceSyncable* prefs) {
     language::LanguagePrefs::RegisterProfilePrefs(prefs->registry());
     prefs->SetString(accept_languages_prefs, std::string());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     prefs->SetString(preferred_languages_prefs, std::string());
 #endif
     TranslatePrefs::RegisterProfilePrefs(prefs->registry());
diff --git a/components/translate/core/browser/translate_prefs.cc b/components/translate/core/browser/translate_prefs.cc
index 7e556a9..ca7cab8e 100644
--- a/components/translate/core/browser/translate_prefs.cc
+++ b/components/translate/core/browser/translate_prefs.cc
@@ -22,7 +22,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/language_prefs.h"
 #include "components/language/core/browser/pref_names.h"
@@ -213,7 +212,7 @@
 // static
 base::Value::List TranslatePrefs::GetDefaultBlockedLanguages() {
   base::Value::List languages;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Preferred languages.
   std::string language = language::kFallbackInputMethodLocale;
   language::ToTranslateLanguageSynonym(&language);
diff --git a/components/translate/core/browser/translate_prefs_unittest.cc b/components/translate/core/browser/translate_prefs_unittest.cc
index 3543d69..6ea1aa2 100644
--- a/components/translate/core/browser/translate_prefs_unittest.cc
+++ b/components/translate/core/browser/translate_prefs_unittest.cc
@@ -19,7 +19,6 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/language/core/browser/language_prefs.h"
 #include "components/language/core/browser/language_prefs_test_util.h"
 #include "components/language/core/browser/pref_names.h"
@@ -71,7 +70,7 @@
 
   void SetUp() override {
     prefs_.SetString(language::prefs::kAcceptLanguages, std::string());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     prefs_.SetString(language::prefs::kPreferredLanguages, std::string());
 #endif
     prefs_.registry()->RegisterBooleanPref(
@@ -591,7 +590,7 @@
                                       {"it", "es"});
   accept_languages_tester_->ExpectAcceptLanguagePrefs("it,en,fr,es");
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   //---------------------------------------------------------------------------
   // Move with policy-forced languages present.
   // Forced languages should always remain at the top of the languages list and
@@ -720,7 +719,7 @@
                                       {"en", "fr", "it", "es", "zh"});
   accept_languages_tester_->ExpectAcceptLanguagePrefs("es,en,fr,it,zh");
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   //---------------------------------------------------------------------------
   // Move with policy-forced languages present.
   // Only test on non-Chrome OS platforms.
@@ -810,7 +809,7 @@
                                       {"fr", "it"});
   accept_languages_tester_->ExpectAcceptLanguagePrefs("en,fr,es,it");
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   //---------------------------------------------------------------------------
   // Move with policy-forced languages present.
   // Only test on non-Chrome OS platforms.
diff --git a/components/translate/core/browser/translate_ui_delegate.cc b/components/translate/core/browser/translate_ui_delegate.cc
index bb402a93..0e71123 100644
--- a/components/translate/core/browser/translate_ui_delegate.cc
+++ b/components/translate/core/browser/translate_ui_delegate.cc
@@ -51,7 +51,7 @@
             language::kContentLanguagesInLanguagePicker,
             language::kContentLanguagesDisableObserversParam,
             false /* default */)) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
       const std::string& pref_name = language::prefs::kPreferredLanguages;
 #else
       const std::string& pref_name = language::prefs::kAcceptLanguages;
diff --git a/components/translate/core/browser/translate_ui_delegate_unittest.cc b/components/translate/core/browser/translate_ui_delegate_unittest.cc
index 0802bc4b..80e7527 100644
--- a/components/translate/core/browser/translate_ui_delegate_unittest.cc
+++ b/components/translate/core/browser/translate_ui_delegate_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/infobars/core/infobar.h"
 #include "components/language/core/browser/language_model.h"
 #include "components/language/core/browser/language_prefs.h"
@@ -60,7 +59,7 @@
         std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
     language::LanguagePrefs::RegisterProfilePrefs(pref_service_->registry());
     pref_service_->SetString(language::prefs::kAcceptLanguages, std::string());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     pref_service_->SetString(language::prefs::kPreferredLanguages,
                              std::string());
 #endif
diff --git a/components/translate/core/browser/translate_ui_languages_manager.cc b/components/translate/core/browser/translate_ui_languages_manager.cc
index ec6d9441..f13457b 100644
--- a/components/translate/core/browser/translate_ui_languages_manager.cc
+++ b/components/translate/core/browser/translate_ui_languages_manager.cc
@@ -12,7 +12,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/language/core/common/language_experiments.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/translate/core/browser/language_state.h"
diff --git a/components/trusted_vault/BUILD.gn b/components/trusted_vault/BUILD.gn
index 97ee3064..3a7565d 100644
--- a/components/trusted_vault/BUILD.gn
+++ b/components/trusted_vault/BUILD.gn
@@ -146,20 +146,4 @@
       "//url",
     ]
   }
-
-  if (is_chromeos_lacros) {
-    sources += [
-      "test/fake_crosapi_trusted_vault_backend.cc",
-      "test/fake_crosapi_trusted_vault_backend.h",
-      "test/fake_crosapi_trusted_vault_backend_service.cc",
-      "test/fake_crosapi_trusted_vault_backend_service.h",
-    ]
-
-    public_deps += [
-      "//chromeos/crosapi/mojom",
-      "//mojo/public/cpp/bindings",
-    ]
-
-    deps += [ "//components/account_manager_core" ]
-  }
 }
diff --git a/components/trusted_vault/test/fake_crosapi_trusted_vault_backend.cc b/components/trusted_vault/test/fake_crosapi_trusted_vault_backend.cc
deleted file mode 100644
index b652b80..0000000
--- a/components/trusted_vault/test/fake_crosapi_trusted_vault_backend.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/trusted_vault/test/fake_crosapi_trusted_vault_backend.h"
-
-#include <utility>
-
-#include "base/check.h"
-#include "chromeos/crosapi/mojom/account_manager.mojom.h"
-#include "components/account_manager_core/account.h"
-#include "components/account_manager_core/account_manager_util.h"
-
-namespace trusted_vault {
-
-FakeCrosapiTrustedVaultBackend::FakeCrosapiTrustedVaultBackend(
-    TrustedVaultClient* client)
-    : trusted_vault_client_(client) {
-  CHECK(trusted_vault_client_);
-  trusted_vault_client_->AddObserver(this);
-}
-
-FakeCrosapiTrustedVaultBackend::~FakeCrosapiTrustedVaultBackend() {
-  trusted_vault_client_->RemoveObserver(this);
-}
-
-void FakeCrosapiTrustedVaultBackend::BindReceiver(
-    mojo::PendingReceiver<crosapi::mojom::TrustedVaultBackend>
-        pending_receiver) {
-  receiver_.Bind(std::move(pending_receiver));
-}
-
-mojo::PendingRemote<crosapi::mojom::TrustedVaultBackend>
-FakeCrosapiTrustedVaultBackend::BindNewPipeAndPassRemote() {
-  return receiver_.BindNewPipeAndPassRemote();
-}
-
-void FakeCrosapiTrustedVaultBackend::FlushMojo() {
-  receiver_.FlushForTesting();
-  observer_.FlushForTesting();
-}
-
-void FakeCrosapiTrustedVaultBackend::SetPrimaryAccountInfo(
-    const CoreAccountInfo& primary_account_info) {
-  primary_account_info_ = primary_account_info;
-}
-
-void FakeCrosapiTrustedVaultBackend::OnTrustedVaultKeysChanged() {
-  if (observer_.is_bound()) {
-    observer_->OnTrustedVaultKeysChanged();
-  }
-}
-
-void FakeCrosapiTrustedVaultBackend::OnTrustedVaultRecoverabilityChanged() {
-  if (observer_.is_bound()) {
-    observer_->OnTrustedVaultRecoverabilityChanged();
-  }
-}
-
-void FakeCrosapiTrustedVaultBackend::AddObserver(
-    mojo::PendingRemote<crosapi::mojom::TrustedVaultBackendObserver> observer) {
-  observer_.Bind(std::move(observer));
-}
-
-void FakeCrosapiTrustedVaultBackend::FetchKeys(
-    crosapi::mojom::AccountKeyPtr account_key,
-    FetchKeysCallback callback) {
-  if (!ValidateAccountKeyIsPrimaryAccount(account_key)) {
-    std::move(callback).Run(std::vector<std::vector<uint8_t>>());
-    return;
-  }
-  trusted_vault_client_->FetchKeys(primary_account_info_, std::move(callback));
-}
-
-void FakeCrosapiTrustedVaultBackend::MarkLocalKeysAsStale(
-    crosapi::mojom::AccountKeyPtr account_key,
-    MarkLocalKeysAsStaleCallback callback) {
-  if (!ValidateAccountKeyIsPrimaryAccount(account_key)) {
-    std::move(callback).Run(false);
-    return;
-  }
-  trusted_vault_client_->MarkLocalKeysAsStale(primary_account_info_,
-                                              std::move(callback));
-}
-
-void FakeCrosapiTrustedVaultBackend::StoreKeys(
-    crosapi::mojom::AccountKeyPtr account_key,
-    const std::vector<std::vector<uint8_t>>& keys,
-    int32_t last_key_version) {
-  if (!ValidateAccountKeyIsPrimaryAccount(account_key)) {
-    return;
-  }
-  trusted_vault_client_->StoreKeys(primary_account_info_.gaia, keys,
-                                   last_key_version);
-}
-
-void FakeCrosapiTrustedVaultBackend::GetIsRecoverabilityDegraded(
-    crosapi::mojom::AccountKeyPtr account_key,
-    GetIsRecoverabilityDegradedCallback callback) {
-  if (!ValidateAccountKeyIsPrimaryAccount(account_key)) {
-    std::move(callback).Run(false);
-    return;
-  }
-  trusted_vault_client_->GetIsRecoverabilityDegraded(primary_account_info_,
-                                                     std::move(callback));
-}
-
-void FakeCrosapiTrustedVaultBackend::AddTrustedRecoveryMethod(
-    crosapi::mojom::AccountKeyPtr account_key,
-    const std::vector<uint8_t>& public_key,
-    int32_t method_type_hint,
-    AddTrustedRecoveryMethodCallback callback) {
-  if (!ValidateAccountKeyIsPrimaryAccount(account_key)) {
-    std::move(callback).Run();
-    return;
-  }
-  trusted_vault_client_->AddTrustedRecoveryMethod(primary_account_info_.gaia,
-                                                  public_key, method_type_hint,
-                                                  std::move(callback));
-}
-
-void FakeCrosapiTrustedVaultBackend::ClearLocalDataForAccount(
-    crosapi::mojom::AccountKeyPtr account_key) {
-  if (!ValidateAccountKeyIsPrimaryAccount(account_key)) {
-    return;
-  }
-  trusted_vault_client_->ClearLocalDataForAccount(primary_account_info_);
-}
-
-bool FakeCrosapiTrustedVaultBackend::ValidateAccountKeyIsPrimaryAccount(
-    const crosapi::mojom::AccountKeyPtr& mojo_account_key) const {
-  const std::optional<account_manager::AccountKey> account_key =
-      account_manager::FromMojoAccountKey(mojo_account_key);
-  return account_key.has_value() &&
-         account_key->account_type() == account_manager::AccountType::kGaia &&
-         account_key->id() == primary_account_info_.gaia;
-}
-
-}  // namespace trusted_vault
diff --git a/components/trusted_vault/test/fake_crosapi_trusted_vault_backend.h b/components/trusted_vault/test/fake_crosapi_trusted_vault_backend.h
deleted file mode 100644
index 21d62af..0000000
--- a/components/trusted_vault/test/fake_crosapi_trusted_vault_backend.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_TRUSTED_VAULT_TEST_FAKE_CROSAPI_TRUSTED_VAULT_BACKEND_H_
-#define COMPONENTS_TRUSTED_VAULT_TEST_FAKE_CROSAPI_TRUSTED_VAULT_BACKEND_H_
-
-#include "chromeos/crosapi/mojom/account_manager.mojom-forward.h"
-#include "chromeos/crosapi/mojom/trusted_vault.mojom.h"
-#include "components/signin/public/identity_manager/account_info.h"
-#include "components/trusted_vault/trusted_vault_client.h"
-#include "mojo/public/cpp/bindings/pending_remote.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-#include "mojo/public/cpp/bindings/remote.h"
-
-namespace trusted_vault {
-
-// Fake implementation of TrustedVaultBackend mojo interface, that allows to
-// test Lacros counterpart of counterpart (real implementation lives in Ash).
-class FakeCrosapiTrustedVaultBackend
-    : public crosapi::mojom::TrustedVaultBackend,
-      public TrustedVaultClient::Observer {
- public:
-  explicit FakeCrosapiTrustedVaultBackend(
-      TrustedVaultClient* client);
-  ~FakeCrosapiTrustedVaultBackend() override;
-
-  void BindReceiver(
-      mojo::PendingReceiver<crosapi::mojom::TrustedVaultBackend> receiver);
-  mojo::PendingRemote<crosapi::mojom::TrustedVaultBackend>
-  BindNewPipeAndPassRemote();
-  void FlushMojo();
-  void SetPrimaryAccountInfo(const CoreAccountInfo& primary_account_info);
-
-  // TrustedVaultClient::Observer implementation.
-  void OnTrustedVaultKeysChanged() override;
-  void OnTrustedVaultRecoverabilityChanged() override;
-
-  // crosapi::mojom::TrustedVaultBackend implementation.
-  void AddObserver(
-      mojo::PendingRemote<crosapi::mojom::TrustedVaultBackendObserver> observer)
-      override;
-  void FetchKeys(crosapi::mojom::AccountKeyPtr account_key,
-                 FetchKeysCallback callback) override;
-  void MarkLocalKeysAsStale(crosapi::mojom::AccountKeyPtr account_key,
-                            MarkLocalKeysAsStaleCallback callback) override;
-  void StoreKeys(crosapi::mojom::AccountKeyPtr account_key,
-                 const std::vector<std::vector<uint8_t>>& keys,
-                 int32_t last_key_version) override;
-  void GetIsRecoverabilityDegraded(
-      crosapi::mojom::AccountKeyPtr account_key,
-      GetIsRecoverabilityDegradedCallback callback) override;
-  void AddTrustedRecoveryMethod(
-      crosapi::mojom::AccountKeyPtr account_key,
-      const std::vector<uint8_t>& public_key,
-      int32_t method_type_hint,
-      AddTrustedRecoveryMethodCallback callback) override;
-  void ClearLocalDataForAccount(
-      crosapi::mojom::AccountKeyPtr account_key) override;
-
- private:
-  bool ValidateAccountKeyIsPrimaryAccount(
-      const crosapi::mojom::AccountKeyPtr& account_key) const;
-
-  CoreAccountInfo primary_account_info_;
-  const raw_ptr<TrustedVaultClient> trusted_vault_client_;
-
-  mojo::Receiver<crosapi::mojom::TrustedVaultBackend> receiver_{this};
-  mojo::Remote<crosapi::mojom::TrustedVaultBackendObserver> observer_;
-};
-
-}  // namespace trusted_vault
-
-#endif  // COMPONENTS_TRUSTED_VAULT_TEST_FAKE_CROSAPI_TRUSTED_VAULT_BACKEND_H_
diff --git a/components/trusted_vault/test/fake_crosapi_trusted_vault_backend_service.cc b/components/trusted_vault/test/fake_crosapi_trusted_vault_backend_service.cc
deleted file mode 100644
index 301f329..0000000
--- a/components/trusted_vault/test/fake_crosapi_trusted_vault_backend_service.cc
+++ /dev/null
@@ -1,64 +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.
-
-#include "components/trusted_vault/test/fake_crosapi_trusted_vault_backend_service.h"
-
-#include "base/check.h"
-#include "base/notreached.h"
-#include "chromeos/crosapi/mojom/account_manager.mojom.h"
-#include "chromeos/crosapi/mojom/trusted_vault.mojom.h"
-#include "components/trusted_vault/test/fake_crosapi_trusted_vault_backend.h"
-
-namespace trusted_vault {
-
-FakeCrosapiTrustedVaultBackendService::FakeCrosapiTrustedVaultBackendService(
-    TrustedVaultClient* chrome_sync_trusted_vault_client,
-    TrustedVaultClient* passkeys_trusted_vault_client)
-    : chrome_sync_trusted_vault_backend_(
-          std::make_unique<trusted_vault::FakeCrosapiTrustedVaultBackend>(
-              chrome_sync_trusted_vault_client)),
-      passkeys_trusted_vault_backend_(
-          std::make_unique<trusted_vault::FakeCrosapiTrustedVaultBackend>(
-              passkeys_trusted_vault_client)) {}
-
-FakeCrosapiTrustedVaultBackendService::
-    ~FakeCrosapiTrustedVaultBackendService() = default;
-
-void FakeCrosapiTrustedVaultBackendService::BindReceiver(
-    mojo::PendingReceiver<crosapi::mojom::TrustedVaultBackendService>
-        pending_receiver) {
-  receiver_.Bind(std::move(pending_receiver));
-}
-
-mojo::PendingRemote<crosapi::mojom::TrustedVaultBackendService>
-FakeCrosapiTrustedVaultBackendService::BindNewPipeAndPassRemote() {
-  return receiver_.BindNewPipeAndPassRemote();
-}
-
-FakeCrosapiTrustedVaultBackend&
-FakeCrosapiTrustedVaultBackendService::chrome_sync_backend() {
-  return *chrome_sync_trusted_vault_backend_;
-}
-
-FakeCrosapiTrustedVaultBackend&
-FakeCrosapiTrustedVaultBackendService::passkeys_backend() {
-  return *passkeys_trusted_vault_backend_;
-}
-
-void FakeCrosapiTrustedVaultBackendService::GetTrustedVaultBackend(
-    crosapi::mojom::SecurityDomainId security_domain,
-    mojo::PendingReceiver<crosapi::mojom::TrustedVaultBackend> backend) {
-  switch (security_domain) {
-    case crosapi::mojom::SecurityDomainId::kUnknown:
-      NOTREACHED();
-    case crosapi::mojom::SecurityDomainId::kChromeSync:
-      chrome_sync_trusted_vault_backend_->BindReceiver(std::move(backend));
-      break;
-    case crosapi::mojom::SecurityDomainId::kPasskeys:
-      passkeys_trusted_vault_backend_->BindReceiver(std::move(backend));
-      break;
-  }
-}
-
-}  // namespace trusted_vault
diff --git a/components/trusted_vault/test/fake_crosapi_trusted_vault_backend_service.h b/components/trusted_vault/test/fake_crosapi_trusted_vault_backend_service.h
deleted file mode 100644
index 774725b..0000000
--- a/components/trusted_vault/test/fake_crosapi_trusted_vault_backend_service.h
+++ /dev/null
@@ -1,55 +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.
-
-#ifndef COMPONENTS_TRUSTED_VAULT_TEST_FAKE_CROSAPI_TRUSTED_VAULT_BACKEND_SERVICE_H_
-#define COMPONENTS_TRUSTED_VAULT_TEST_FAKE_CROSAPI_TRUSTED_VAULT_BACKEND_SERVICE_H_
-
-#include <memory>
-
-#include "chromeos/crosapi/mojom/trusted_vault.mojom.h"
-#include "components/trusted_vault/test/fake_crosapi_trusted_vault_backend.h"
-#include "components/trusted_vault/trusted_vault_client.h"
-#include "mojo/public/cpp/bindings/pending_remote.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-#include "mojo/public/cpp/bindings/remote.h"
-
-namespace trusted_vault {
-
-// Fake implementation of TrustedVaultBackendService mojo interface, that allows
-// to test Lacros counterpart of counterpart (real implementation lives in Ash).
-class FakeCrosapiTrustedVaultBackendService
-    : public crosapi::mojom::TrustedVaultBackendService {
- public:
-  FakeCrosapiTrustedVaultBackendService(
-      TrustedVaultClient* chrome_sync_trusted_vault_client,
-      TrustedVaultClient* passkeys_trusted_vault_client);
-  ~FakeCrosapiTrustedVaultBackendService() override;
-
-  void BindReceiver(
-      mojo::PendingReceiver<crosapi::mojom::TrustedVaultBackendService>
-          receiver);
-  mojo::PendingRemote<crosapi::mojom::TrustedVaultBackendService>
-  BindNewPipeAndPassRemote();
-
-  FakeCrosapiTrustedVaultBackend& chrome_sync_backend();
-  FakeCrosapiTrustedVaultBackend& passkeys_backend();
-
-  // crosapi::mojom::TrustedVaultBackendService:
-  void GetTrustedVaultBackend(
-      crosapi::mojom::SecurityDomainId security_domain,
-      mojo::PendingReceiver<crosapi::mojom::TrustedVaultBackend> backend)
-      override;
-
- private:
-  std::unique_ptr<trusted_vault::FakeCrosapiTrustedVaultBackend>
-      chrome_sync_trusted_vault_backend_;
-  std::unique_ptr<trusted_vault::FakeCrosapiTrustedVaultBackend>
-      passkeys_trusted_vault_backend_;
-
-  mojo::Receiver<crosapi::mojom::TrustedVaultBackendService> receiver_{this};
-};
-
-}  // namespace trusted_vault
-
-#endif  // COMPONENTS_TRUSTED_VAULT_TEST_FAKE_CROSAPI_TRUSTED_VAULT_BACKEND_SERVICE_H_
diff --git a/components/unified_consent/BUILD.gn b/components/unified_consent/BUILD.gn
index 0a55ab8..78759bc 100644
--- a/components/unified_consent/BUILD.gn
+++ b/components/unified_consent/BUILD.gn
@@ -40,7 +40,6 @@
   deps = [
     ":unified_consent",
     "//base/test:test_support",
-    "//build:chromeos_buildflags",
     "//components/signin/public/identity_manager:test_support",
     "//components/sync:test_support",
     "//components/sync_preferences:test_support",
diff --git a/components/unified_consent/pref_names.cc b/components/unified_consent/pref_names.cc
index b71abb0..241b197 100644
--- a/components/unified_consent/pref_names.cc
+++ b/components/unified_consent/pref_names.cc
@@ -7,9 +7,9 @@
 namespace unified_consent {
 namespace prefs {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 const char kUnifiedConsentMigrationState[] = "unified_consent.migration_state";
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 const char kUrlKeyedAnonymizedDataCollectionEnabled[] =
     "url_keyed_anonymized_data_collection.enabled";
 
diff --git a/components/unified_consent/pref_names.h b/components/unified_consent/pref_names.h
index b59514d..b4f65dc3 100644
--- a/components/unified_consent/pref_names.h
+++ b/components/unified_consent/pref_names.h
@@ -6,11 +6,10 @@
 #define COMPONENTS_UNIFIED_CONSENT_PREF_NAMES_H_
 
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 
 namespace unified_consent::prefs {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 // Integer indicating the migration state of unified consent, defined in
 // unified_consent::MigrationState.
 //
diff --git a/components/unified_consent/unified_consent_service.cc b/components/unified_consent/unified_consent_service.cc
index d90746c..a8833b7 100644
--- a/components/unified_consent/unified_consent_service.cc
+++ b/components/unified_consent/unified_consent_service.cc
@@ -164,7 +164,7 @@
   DCHECK(identity_manager_);
   DCHECK(sync_service_);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (GetMigrationState() == MigrationState::kNotInitialized)
     MigrateProfileToUnifiedConsent();
 #endif
@@ -186,7 +186,7 @@
     user_prefs::PrefRegistrySyncable* registry) {
   registry->RegisterBooleanPref(prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
                                 false);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   registry->RegisterIntegerPref(
       prefs::kUnifiedConsentMigrationState,
       static_cast<int>(MigrationState::kNotInitialized));
@@ -195,7 +195,7 @@
 
 void UnifiedConsentService::SetUrlKeyedAnonymizedDataCollectionEnabled(
     bool enabled) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   if (GetMigrationState() != MigrationState::kCompleted)
     SetMigrationState(MigrationState::kCompleted);
 #endif
@@ -267,7 +267,7 @@
       service_pref_changes_.clear();
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // TODO(crbug.com/40066949): Simplify (remove the following block) after
   // Sync-the-feature users are migrated to ConsentLevel::kSignin (and thus
   // CanSyncFeatureStart() always returns false).
@@ -317,7 +317,7 @@
   service_pref_changes_[name] = value.Clone();
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 MigrationState UnifiedConsentService::GetMigrationState() {
   int migration_state_int =
       pref_service_->GetInteger(prefs::kUnifiedConsentMigrationState);
@@ -365,6 +365,6 @@
       !sync_service_->GetUserSettings()->IsUsingExplicitPassphrase();
   SetUrlKeyedAnonymizedDataCollectionEnabled(url_keyed_metrics_enabled);
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  //  namespace unified_consent
diff --git a/components/unified_consent/unified_consent_service.h b/components/unified_consent/unified_consent_service.h
index 12c1e97..c9281536 100644
--- a/components/unified_consent/unified_consent_service.h
+++ b/components/unified_consent/unified_consent_service.h
@@ -32,14 +32,14 @@
 
 namespace unified_consent {
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 enum class MigrationState : int {
   kNotInitialized = 0,
   kInProgressWaitForSyncInit = 1,
   // Reserve space for other kInProgress* entries to be added here.
   kCompleted = 10,
 };
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // A browser-context keyed service that is used to manage the user consent
 // when UnifiedConsent feature is enabled.
@@ -127,7 +127,7 @@
   void StopObservingServicePrefChanges();
   void ServicePrefChanged(const std::string& name);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Migration helpers.
   MigrationState GetMigrationState();
   void SetMigrationState(MigrationState migration_state);
diff --git a/components/unified_consent/unified_consent_service_unittest.cc b/components/unified_consent/unified_consent_service_unittest.cc
index 7291b5c..f07ed97 100644
--- a/components/unified_consent/unified_consent_service_unittest.cc
+++ b/components/unified_consent/unified_consent_service_unittest.cc
@@ -13,7 +13,6 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
 #include "components/sync/base/features.h"
 #include "components/sync/base/user_selectable_type.h"
@@ -91,7 +90,7 @@
     }
   }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   unified_consent::MigrationState GetMigrationState() {
     int migration_state_int =
         pref_service_.GetInteger(prefs::kUnifiedConsentMigrationState);
@@ -199,7 +198,7 @@
       prefs::kUrlKeyedAnonymizedDataCollectionEnabled));
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // Tests that kUrlKeyedAnonymizedDataCollectionEnabled is enabled after
 // syncing user signs out, then in again and enabled history sync opt-in.
 TEST_F(UnifiedConsentServiceTest,
@@ -238,7 +237,7 @@
   EXPECT_FALSE(pref_service()->GetBoolean(
       prefs::kUrlKeyedAnonymizedDataCollectionEnabled));
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 // Tests that any change to history sync opt-in, is reflected in the state
 // of `kUrlKeyedAnonymizedDataCollectionEnabled`.
@@ -361,7 +360,7 @@
   }
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 TEST_F(UnifiedConsentServiceTest, Migration_UpdateSettings) {
   // Create user that syncs history and has no custom passphrase.
   SignIn(signin::ConsentLevel::kSync);
@@ -402,6 +401,6 @@
   EXPECT_FALSE(pref_service()->GetBoolean(
       prefs::kUrlKeyedAnonymizedDataCollectionEnabled));
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace unified_consent
diff --git a/components/update_client/BUILD.gn b/components/update_client/BUILD.gn
index 3f795f9..aa23adb 100644
--- a/components/update_client/BUILD.gn
+++ b/components/update_client/BUILD.gn
@@ -65,7 +65,6 @@
   ]
   deps = [
     ":update_client",
-    "//build:chromeos_buildflags",
     "//components/services/patch/public/cpp",
     "//components/services/patch/public/mojom",
     "//mojo/public/cpp/bindings",
@@ -163,7 +162,6 @@
   deps = [
     "//base",
     "//build:branding_buildflags",
-    "//build:chromeos_buildflags",
     "//components/client_update_protocol",
     "//components/crx_file",
     "//components/prefs",
diff --git a/components/update_client/update_query_params.cc b/components/update_client/update_query_params.cc
index 1a8b445..b1701d0 100644
--- a/components/update_client/update_query_params.cc
+++ b/components/update_client/update_query_params.cc
@@ -9,7 +9,6 @@
 #include "base/system/sys_info.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/update_client/update_query_params_delegate.h"
 #include "components/version_info/version_info.h"
 
@@ -34,7 +33,7 @@
     "android";
 #elif BUILDFLAG(IS_CHROMEOS)
     "cros";
-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#elif BUILDFLAG(IS_LINUX)
     "linux";
 #elif BUILDFLAG(IS_FUCHSIA)
     "fuchsia";
diff --git a/components/user_education/common/feature_promo/impl/precondition_data.h b/components/user_education/common/feature_promo/impl/precondition_data.h
index 1f35c15..51823f3 100644
--- a/components/user_education/common/feature_promo/impl/precondition_data.h
+++ b/components/user_education/common/feature_promo/impl/precondition_data.h
@@ -16,13 +16,6 @@
 
 namespace user_education::internal {
 
-// Base already has an is_raw_ref, but there is no is_raw_ptr, so implement it
-// here.
-template <typename T>
-struct is_raw_ptr : std::false_type {};
-template <typename T, base::RawPtrTraits Traits>
-struct is_raw_ptr<raw_ptr<T, Traits>> : std::true_type {};
-
 // A value is cacheable if:
 //  - it is moveable
 //  - it is default-constructable
@@ -32,8 +25,8 @@
 // To hold polymorphic or non-moveable objects, use std::unique_ptr.
 template <typename T>
 concept PreconditionCacheable =
-    std::movable<T> && std::default_initializable<T> && !std::is_pointer_v<T> &&
-    !is_raw_ptr<T>::value && !base::internal::is_raw_ref_v<T>;
+    std::movable<T> && std::default_initializable<T> &&
+    !base::IsPointerOrRawPtr<T> && !base::IsRawRef<T>;
 
 template <typename T>
   requires PreconditionCacheable<T>
diff --git a/components/user_manager/BUILD.gn b/components/user_manager/BUILD.gn
index 1453abe..ad904ec 100644
--- a/components/user_manager/BUILD.gn
+++ b/components/user_manager/BUILD.gn
@@ -2,8 +2,6 @@
 # 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")
-
 component("common") {
   sources = [
     "user_type.cc",
@@ -41,7 +39,7 @@
 
   defines = [ "USER_MANAGER_IMPLEMENTATION" ]
 
-  if (is_chromeos_ash) {
+  if (is_chromeos) {
     sources += [
       "account_id_util.cc",
       "account_id_util.h",
@@ -82,7 +80,7 @@
   }
 }
 
-if (is_chromeos_ash) {
+if (is_chromeos) {
   source_set("test_support") {
     testonly = true
     sources = [
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn
index 1dcab7786..2d20fe5 100644
--- a/components/vector_icons/BUILD.gn
+++ b/components/vector_icons/BUILD.gn
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/chromeos/ui_mode.gni")
 import("//build/util/branding.gni")
 import("//components/vector_icons/vector_icons.gni")
 
@@ -259,11 +258,10 @@
   ]
 
   if (is_chromeos) {
-    sources += [ "notification_download.icon" ]
-  }
-
-  if (is_chromeos_ash) {
-    sources += [ "videogame_asset_outline.icon" ]
+    sources += [
+      "notification_download.icon",
+      "videogame_asset_outline.icon",
+    ]
   }
 
   if (is_chrome_branded) {
diff --git a/components/version_ui/BUILD.gn b/components/version_ui/BUILD.gn
index 913cf913..49f73fb 100644
--- a/components/version_ui/BUILD.gn
+++ b/components/version_ui/BUILD.gn
@@ -12,7 +12,6 @@
 
   deps = [
     "//base",
-    "//build:chromeos_buildflags",
     "//components/variations",
     "//components/variations/net",
     "//components/variations/service",
diff --git a/components/version_ui/version_ui_constants.cc b/components/version_ui/version_ui_constants.cc
index 1054d152..a467784 100644
--- a/components/version_ui/version_ui_constants.cc
+++ b/components/version_ui/version_ui_constants.cc
@@ -5,7 +5,6 @@
 #include "components/version_ui/version_ui_constants.h"
 
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 
 namespace version_ui {
 
@@ -49,7 +48,7 @@
 #endif
 const char kLogoAltText[] = "logo_alt_text";
 const char kOfficial[] = "official";
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 const char kOSName[] = "os_name";
 const char kOSType[] = "os_type";
 #endif
diff --git a/components/version_ui/version_ui_constants.h b/components/version_ui/version_ui_constants.h
index 0d35047..5d43d76 100644
--- a/components/version_ui/version_ui_constants.h
+++ b/components/version_ui/version_ui_constants.h
@@ -6,7 +6,6 @@
 #define COMPONENTS_VERSION_UI_VERSION_UI_CONSTANTS_H_
 
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 
 namespace version_ui {
 
@@ -51,7 +50,7 @@
 #endif
 extern const char kLogoAltText[];
 extern const char kOfficial[];
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 extern const char kOSName[];
 extern const char kOSType[];
 #endif
diff --git a/components/web_resource/BUILD.gn b/components/web_resource/BUILD.gn
index b9fc4bf..ab73617 100644
--- a/components/web_resource/BUILD.gn
+++ b/components/web_resource/BUILD.gn
@@ -15,7 +15,6 @@
   deps = [
     "//base",
     "//build:branding_buildflags",
-    "//build:chromeos_buildflags",
     "//components/pref_registry",
     "//components/prefs",
     "//services/network/public/cpp",
diff --git a/components/web_resource/eula_accepted_notifier.cc b/components/web_resource/eula_accepted_notifier.cc
index 23cb39c..ac78d2f6 100644
--- a/components/web_resource/eula_accepted_notifier.cc
+++ b/components/web_resource/eula_accepted_notifier.cc
@@ -8,7 +8,6 @@
 #include "base/functional/bind.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/prefs/pref_service.h"
 #include "components/web_resource/web_resource_pref_names.h"
 
@@ -44,7 +43,7 @@
 EulaAcceptedNotifier* EulaAcceptedNotifier::Create(PrefService* local_state) {
 // First run EULA only exists on ChromeOS, Android and iOS. On ChromeOS, it is
 // only shown in official builds.
-#if (BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(GOOGLE_CHROME_BRANDING)) || \
+#if (BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(GOOGLE_CHROME_BRANDING)) || \
     BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
   // Tests that use higher-level classes that use EulaAcceptNotifier may not
   // have local state or may not register this pref. Return null to indicate not
diff --git a/content/browser/attribution_reporting/attribution_report_network_sender.cc b/content/browser/attribution_reporting/attribution_report_network_sender.cc
index 4e55c6d..63bd3249 100644
--- a/content/browser/attribution_reporting/attribution_report_network_sender.cc
+++ b/content/browser/attribution_reporting/attribution_report_network_sender.cc
@@ -61,7 +61,7 @@
 
 template <typename T>
 void NetworkHistogram(std::string_view suffix,
-                      void (*hist_func)(const std::string&, T value),
+                      void (*hist_func)(std::string_view, T value),
                       bool is_debug_report,
                       std::optional<bool> has_trigger_context_id,
                       T value) {
diff --git a/content/browser/preloading/prefetch/prefetch_url_loader_helper.cc b/content/browser/preloading/prefetch/prefetch_url_loader_helper.cc
index f07f4e5..4a47aa8c 100644
--- a/content/browser/preloading/prefetch/prefetch_url_loader_helper.cc
+++ b/content/browser/preloading/prefetch/prefetch_url_loader_helper.cc
@@ -318,7 +318,7 @@
 
 void OnGotPrefetchToServe(
     FrameTreeNodeId frame_tree_node_id,
-    const network::ResourceRequest& tentative_resource_request,
+    const GURL& tentative_resource_request_url,
     base::OnceCallback<void(PrefetchContainer::Reader)> get_prefetch_callback,
     PrefetchContainer::Reader reader) {
   // TODO(crbug.com/40274818): With multiple prefetches matching, we should
@@ -326,15 +326,14 @@
   // Why ? Because we might be able to serve a different prefetch if the
   // prefetch in the `reader` cannot be served.
 
-  // The |tentative_resource_request.url| might be different from
-  // |GetCurrentURLToServe()| because of No-Vary-Search non-exact url
-  // match.
+  // The `tentative_resource_request_url` might be different from
+  // `GetCurrentURLToServe()` because of No-Vary-Search non-exact url match.
 #if DCHECK_IS_ON()
   if (reader) {
     GURL::Replacements replacements;
     replacements.ClearRef();
     replacements.ClearQuery();
-    DCHECK_EQ(tentative_resource_request.url.ReplaceComponents(replacements),
+    DCHECK_EQ(tentative_resource_request_url.ReplaceComponents(replacements),
               reader.GetCurrentURLToServe().ReplaceComponents(replacements));
   }
 #endif
@@ -369,7 +368,7 @@
   // done.
   ContinueOnGotPrefetchToServe(base::WrapUnique(new OnGotPrefetchToServeState{
       .frame_tree_node_id = frame_tree_node_id,
-      .tentative_url = tentative_resource_request.url,
+      .tentative_url = tentative_resource_request_url,
       .callback = std::move(get_prefetch_callback),
       .reader = std::move(reader)}));
 }
diff --git a/content/browser/preloading/prefetch/prefetch_url_loader_helper.h b/content/browser/preloading/prefetch/prefetch_url_loader_helper.h
index 17a739b..007c1c7d 100644
--- a/content/browser/preloading/prefetch/prefetch_url_loader_helper.h
+++ b/content/browser/preloading/prefetch/prefetch_url_loader_helper.h
@@ -13,11 +13,12 @@
 
 namespace content {
 
-// Checks if `prefetch_container` can be used for `tentative_resource_request`,
-// and starts checking `PrefetchOriginProber` if needed.
+// Checks if `prefetch_container` can be used for the url of intercepted
+// `tentative_resource_request`, and starts checking `PrefetchOriginProber` if
+// needed.
 void CONTENT_EXPORT OnGotPrefetchToServe(
     FrameTreeNodeId frame_tree_node_id,
-    const network::ResourceRequest& tentative_resource_request,
+    const GURL& tentative_resource_request_url,
     base::OnceCallback<void(PrefetchContainer::Reader)> get_prefetch_callback,
     PrefetchContainer::Reader reader);
 
diff --git a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc
index 95b85ec1..8e27d4a 100644
--- a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc
+++ b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc
@@ -112,7 +112,7 @@
       }
     } else {
       OnGotPrefetchToServe(
-          frame_tree_node_id_, tentative_resource_request,
+          frame_tree_node_id_, tentative_resource_request.url,
           base::BindOnce(&PrefetchURLLoaderInterceptor::OnGetPrefetchComplete,
                          weak_factory_.GetWeakPtr()),
           std::move(redirect_reader_));
@@ -184,11 +184,13 @@
     CHECK(!serving_page_metrics_container_);
   }
 
+  const GURL tentative_resource_request_url = tentative_resource_request.url;
   auto callback = base::BindOnce(&OnGotPrefetchToServe, frame_tree_node_id_,
-                                 tentative_resource_request,
+                                 tentative_resource_request_url,
                                  std::move(get_prefetch_callback));
   auto key = PrefetchContainer::Key(initiator_document_token_,
-                                    tentative_resource_request.url);
+                                    tentative_resource_request_url);
+
   if (UseNewWaitLoop()) {
     const bool is_nav_prerender = [&]() -> bool {
       auto* frame_tree_node =
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 de62d87..0668684 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -2101,7 +2101,7 @@
   return gfx::Size();
 }
 
-gfx::Size RenderWidgetHostViewAura::GetMaximumSize() const {
+std::optional<gfx::Size> RenderWidgetHostViewAura::GetMaximumSize() const {
   return gfx::Size();
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h
index 75519fa..564a870 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.h
+++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -330,7 +330,7 @@
 
   // Overridden from aura::WindowDelegate:
   gfx::Size GetMinimumSize() const override;
-  gfx::Size GetMaximumSize() const override;
+  std::optional<gfx::Size> GetMaximumSize() const override;
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override;
   gfx::NativeCursor GetCursor(const gfx::Point& point) override;
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc
index 2d0345e..93469d8 100644
--- a/content/browser/web_contents/web_contents_view_aura.cc
+++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -1230,7 +1230,7 @@
   return gfx::Size();
 }
 
-gfx::Size WebContentsViewAura::GetMaximumSize() const {
+std::optional<gfx::Size> WebContentsViewAura::GetMaximumSize() const {
   return gfx::Size();
 }
 
diff --git a/content/browser/web_contents/web_contents_view_aura.h b/content/browser/web_contents/web_contents_view_aura.h
index 6072c55..d4b3685 100644
--- a/content/browser/web_contents/web_contents_view_aura.h
+++ b/content/browser/web_contents/web_contents_view_aura.h
@@ -258,7 +258,7 @@
 
   // Overridden from aura::WindowDelegate:
   gfx::Size GetMinimumSize() const override;
-  gfx::Size GetMaximumSize() const override;
+  std::optional<gfx::Size> GetMaximumSize() const override;
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override;
   gfx::NativeCursor GetCursor(const gfx::Point& point) override;
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc
index 0e1a4f4..8c03b75 100644
--- a/content/browser/webid/federated_auth_request_impl.cc
+++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -919,9 +919,7 @@
               permission_delegate_);
 
       url::Origin idp_origin = url::Origin::Create(idp_ptr->config->config_url);
-      if (has_failing_idp_signin_status &&
-          webid::GetIdpSigninStatusMode(render_frame_host(), idp_origin) ==
-              FedCmIdpSigninStatusMode::ENABLED) {
+      if (has_failing_idp_signin_status) {
         if (idp_get_params_ptr->mode == blink::mojom::RpMode::kPassive) {
           if (IsFedCmMultipleIdentityProvidersEnabled()) {
             // In the multi IDP case, we do not want to complete the request
@@ -1324,11 +1322,7 @@
         webid::ShouldFailAccountsEndpointRequestBecauseNotSignedInWithIdp(
             render_frame_host(), identity_provider_config_url,
             permission_delegate_);
-    if (idp_info->has_failing_idp_signin_status &&
-        webid::GetIdpSigninStatusMode(
-            render_frame_host(),
-            url::Origin::Create(identity_provider_config_url)) ==
-            FedCmIdpSigninStatusMode::ENABLED) {
+    if (idp_info->has_failing_idp_signin_status) {
       // If the user is logged out and we are in a active-mode, allow the user
       // to sign-in to the IdP and return early.
       if (rp_mode_ == blink::mojom::RpMode::kActive) {
@@ -1824,10 +1818,7 @@
     std::optional<TokenStatus> token_status) {
   url::Origin idp_origin =
       url::Origin::Create(idp_info->provider->config->config_url);
-  FedCmIdpSigninStatusMode signin_status_mode =
-      webid::GetIdpSigninStatusMode(render_frame_host(), idp_origin);
-  if (!old_idp_signin_status.has_value() ||
-      signin_status_mode == FedCmIdpSigninStatusMode::METRICS_ONLY) {
+  if (!old_idp_signin_status.has_value()) {
     if (rp_mode_ == blink::mojom::RpMode::kActive) {
       MaybeShowActiveModeModalDialog(idp_info->provider->config->config_url,
                                      idp_info->metadata.idp_login_url);
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc
index 7906db9..6bd6b41 100644
--- a/content/browser/webid/federated_auth_request_impl_unittest.cc
+++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -1905,16 +1905,26 @@
   EXPECT_EQ("Provider's FedCM config file is invalid.", messages[1]);
 }
 
-// Test that request does not fail if config is missing an IDP login URL.
+// Test that request fails if config is missing an IDP login URL.
 TEST_F(FederatedAuthRequestImplTest, MissingLoginURL) {
-  // Login URL is only optional when the signin status API is disabled.
-  base::test::ScopedFeatureList list;
-  list.InitAndDisableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   MockConfiguration configuration = kConfigurationValid;
   configuration.idp_info[kProviderUrlFull].config.idp_login_url = "";
-  RunAuthTest(kDefaultRequestParameters, kExpectationSuccess, configuration);
+  RequestExpectations expectations = {
+      RequestTokenStatus::kError,
+      FederatedAuthRequestResult::kConfigInvalidResponse,
+      /*standalone_console_message=*/std::nullopt,
+      /*selected_idp_config_url=*/std::nullopt};
+  RunAuthTest(kDefaultRequestParameters, expectations, configuration);
   EXPECT_TRUE(DidFetchWellKnownAndConfig());
+
+  std::vector<std::string> messages =
+      RenderFrameHostTester::For(main_rfh())->GetConsoleMessages();
+  ASSERT_EQ(2U, messages.size());
+  EXPECT_EQ(
+      "Config file is missing or has an invalid URL for the following:\n"
+      "\"login_url\"\n",
+      messages[0]);
+  EXPECT_EQ("Provider's FedCM config file is invalid.", messages[1]);
 }
 
 // Test that client metadata endpoint is not required in config.
@@ -1944,10 +1954,6 @@
 // Test that request fails if IDP login URL is different origin from IDP config
 // URL.
 TEST_F(FederatedAuthRequestImplTest, LoginUrlDifferentOriginIdp) {
-  // We only validate the login_url if IdpSigninStatus is enabled.
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   MockConfiguration configuration = kConfigurationValid;
   configuration.idp_info[kProviderUrlFull].config.idp_login_url =
       "https://idp2.example/login_url";
@@ -3806,9 +3812,6 @@
 // Test that first API call with a given IDP is not affected by the
 // IdpSigninStatus bit.
 TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusTestFirstTimeFetchSuccess) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   EXPECT_CALL(*test_permission_delegate_,
               SetIdpSigninStatus(OriginFromString(kProviderUrlFull), true))
       .Times(1);
@@ -3826,9 +3829,6 @@
 // failure during fetching accounts.
 TEST_F(FederatedAuthRequestImplTest,
        IdpSigninStatusTestFirstTimeFetchNoFailureUi) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   EXPECT_CALL(*test_permission_delegate_,
               SetIdpSigninStatus(OriginFromString(kProviderUrlFull), false))
       .Times(1);
@@ -3849,9 +3849,6 @@
 // Test that a failure UI will be displayed if the accounts fetch is failed but
 // the IdpSigninStatus claims that the user is signed in.
 TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusTestShowFailureUi) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   test_permission_delegate_
       ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = true;
 
@@ -3874,9 +3871,6 @@
 // UI is displayed.
 TEST_F(FederatedAuthRequestImplTest,
        IdpSigninStatusTestApiFailedIfUserNotSignedInWithIdp) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   test_permission_delegate_
       ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = false;
 
@@ -3953,9 +3947,6 @@
 // 2) User signs-in
 // 3) User selects "Continue" in account chooser dialog.
 TEST_F(FederatedAuthRequestImplTest, FailureUiThenSuccessfulSignin) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   SetNetworkRequestManager(
       std::make_unique<ParseStatusOverrideIdpNetworkRequestManager>());
   auto* network_manager =
@@ -4006,9 +3997,6 @@
 // 2) User switches tabs
 // 3) User signs into IdP in different tab
 TEST_F(FederatedAuthRequestImplTest, FailureUiThenSuccessfulSigninButHidden) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   SetNetworkRequestManager(
       std::make_unique<ParseStatusOverrideIdpNetworkRequestManager>());
   auto* network_manager =
@@ -4058,9 +4046,6 @@
 // 1) Failure dialog is shown due to IdP sign-in status mismatch
 // 2) In a different tab, user signs into different IdP
 TEST_F(FederatedAuthRequestImplTest, FailureUiSigninFromDifferentIdp) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   SetNetworkRequestManager(
       std::make_unique<ParseStatusOverrideIdpNetworkRequestManager>());
   auto* network_manager =
@@ -4115,9 +4100,6 @@
 // That ShowFailureDialog() is called a 2nd time after the IdP sign-in status
 // update.
 TEST_F(FederatedAuthRequestImplTest, FailureUiAccountEndpointKeepsFailing) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   url::Origin kIdpOrigin = OriginFromString(kProviderUrlFull);
 
   MockConfiguration configuration = kConfigurationValid;
@@ -4175,9 +4157,6 @@
 // status update.
 // That user is shown IdP-sign-in-failure dialog.
 TEST_F(FederatedAuthRequestImplTest, FailureUiThenFailDifferentEndpoint) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   SetNetworkRequestManager(
       std::make_unique<ParseStatusOverrideIdpNetworkRequestManager>());
   auto* network_manager =
@@ -4237,21 +4216,6 @@
   CheckAllFedCmSessionIDs();
 }
 
-// Test that when IdpSigninStatus API is in the metrics-only mode, that an IDP
-// signed-out status stays signed-out regardless of what is returned by the
-// accounts endpoint.
-TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusMetricsModeStaysSignedout) {
-  base::test::ScopedFeatureList list;
-  list.InitWithFeatures({}, {features::kFedCmIdpSigninStatusEnabled});
-
-  test_permission_delegate_
-      ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = false;
-  EXPECT_CALL(*test_permission_delegate_, SetIdpSigninStatus(_, _)).Times(0);
-
-  RunAuthTest(kDefaultRequestParameters, kExpectationSuccess,
-              kConfigurationValid);
-}
-
 // Test that when IdpSigninStatus API does not have any state for an IDP, that
 // the state transitions to sign-in if the accounts endpoint returns a
 // non-empty list of accounts.
@@ -4267,31 +4231,6 @@
               kConfigurationValid);
 }
 
-// Test that when IdpSigninStatus API is in metrics-only mode, that IDP sign-in
-// status transitions to signed-out if the accounts endpoint returns no
-// information.
-TEST_F(FederatedAuthRequestImplTest,
-       IdpSigninStatusMetricsModeTransitionsToSignedoutWhenNoAccounts) {
-  base::test::ScopedFeatureList list;
-  list.InitWithFeatures({}, {features::kFedCmIdpSigninStatusEnabled});
-
-  test_permission_delegate_
-      ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = true;
-  EXPECT_CALL(*test_permission_delegate_,
-              SetIdpSigninStatus(OriginFromString(kProviderUrlFull), false));
-
-  MockConfiguration configuration = kConfigurationValid;
-  configuration.idp_info[kProviderUrlFull].accounts_response.parse_status =
-      ParseStatus::kInvalidResponseError;
-  RequestExpectations expectations = {
-      RequestTokenStatus::kError,
-      FederatedAuthRequestResult::kAccountsInvalidResponse,
-      /*standalone_console_message=*/std::nullopt, std::nullopt};
-  RunAuthTest(kDefaultRequestParameters, expectations, configuration);
-  EXPECT_TRUE(DidFetch(FetchedEndpoint::ACCOUNTS));
-  EXPECT_FALSE(did_show_accounts_dialog());
-}
-
 // Tests that multiple IDPs provided results in an error if the
 // `kFedCmMultipleIdentityProviders` flag is disabled.
 TEST_F(FederatedAuthRequestImplTest, MultiIdpDisabled) {
@@ -6482,9 +6421,6 @@
 // Tests that when a mismatch dialog is shown, the appropriate metrics are
 // recorded.
 TEST_F(FederatedAuthRequestImplTest, MismatchDialogShownMetric) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   base::RunLoop ukm_loop;
   ukm_recorder()->SetOnAddEntryCallback(FedCmEntry::kEntryName,
                                         ukm_loop.QuitClosure());
@@ -6515,9 +6451,6 @@
 
 // Tests that a mismatch dialog is shown twice.
 TEST_F(FederatedAuthRequestImplTest, DoubleMismatchDialog) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   base::RunLoop ukm_loop;
   ukm_recorder()->SetOnAddEntryCallback(FedCmEntry::kEntryName,
                                         ukm_loop.QuitClosure());
@@ -6613,9 +6546,6 @@
 // Tests that when a mismatch dialog is aborted, the appropriate duration
 // metrics are recorded.
 TEST_F(FederatedAuthRequestImplTest, AbortedMismatchDialogShownDurationMetric) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   base::RunLoop ukm_loop;
   ukm_recorder()->SetOnAddEntryCallback(FedCmEntry::kEntryName,
                                         ukm_loop.QuitClosure());
@@ -6827,9 +6757,6 @@
 
 // Test that permission is embargoed upon closing a mismatch dialog.
 TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusCloseMismatchEmbargo) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   test_permission_delegate_
       ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = true;
 
@@ -6852,9 +6779,6 @@
 // Test that permission is not embargoed upon closing an IDP sign-in flow
 // pop-up.
 TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusClosePopupEmbargo) {
-  base::test::ScopedFeatureList list;
-  list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   test_permission_delegate_
       ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = true;
 
diff --git a/content/browser/webid/federated_auth_user_info_request.cc b/content/browser/webid/federated_auth_user_info_request.cc
index 8f2437e..523a49dc 100644
--- a/content/browser/webid/federated_auth_user_info_request.cc
+++ b/content/browser/webid/federated_auth_user_info_request.cc
@@ -144,9 +144,7 @@
   }
 
   if (webid::ShouldFailAccountsEndpointRequestBecauseNotSignedInWithIdp(
-          *render_frame_host_, idp_config_url_, permission_delegate_) &&
-      webid::GetIdpSigninStatusMode(*render_frame_host_, idp_origin) ==
-          FedCmIdpSigninStatusMode::ENABLED) {
+          *render_frame_host_, idp_config_url_, permission_delegate_)) {
     CompleteWithError(FederatedAuthUserInfoRequestResult::kNotSignedInWithIdp);
     return;
   }
@@ -198,10 +196,7 @@
   does_idp_have_failing_signin_status_ =
       webid::ShouldFailAccountsEndpointRequestBecauseNotSignedInWithIdp(
           *render_frame_host_, idp_config_url_, permission_delegate_);
-  if (does_idp_have_failing_signin_status_ &&
-      webid::GetIdpSigninStatusMode(*render_frame_host_,
-                                    url::Origin::Create(idp_config_url_)) ==
-          FedCmIdpSigninStatusMode::ENABLED) {
+  if (does_idp_have_failing_signin_status_) {
     CompleteWithError(FederatedAuthUserInfoRequestResult::kNotSignedInWithIdp);
     return;
   }
diff --git a/content/browser/webid/federated_provider_fetcher.cc b/content/browser/webid/federated_provider_fetcher.cc
index 3760ab8..2d067f9 100644
--- a/content/browser/webid/federated_provider_fetcher.cc
+++ b/content/browser/webid/federated_provider_fetcher.cc
@@ -240,13 +240,10 @@
       result.identity_provider_config_url, result.endpoints.accounts);
   url::Origin idp_origin =
       url::Origin::Create(result.identity_provider_config_url);
-
   bool is_login_url_valid =
-      webid::GetIdpSigninStatusMode(render_frame_host_.get(), idp_origin) !=
-          FedCmIdpSigninStatusMode::ENABLED ||
-      (result.metadata &&
-       webid::IsEndpointSameOrigin(result.identity_provider_config_url,
-                                   result.metadata->idp_login_url));
+      result.metadata &&
+      webid::IsEndpointSameOrigin(result.identity_provider_config_url,
+                                  result.metadata->idp_login_url);
 
   if (!is_token_valid || !is_accounts_valid || !is_login_url_valid) {
     std::string console_message =
diff --git a/content/browser/webid/federated_provider_fetcher_unittest.cc b/content/browser/webid/federated_provider_fetcher_unittest.cc
index ad42546..7b03525a 100644
--- a/content/browser/webid/federated_provider_fetcher_unittest.cc
+++ b/content/browser/webid/federated_provider_fetcher_unittest.cc
@@ -515,8 +515,6 @@
 }
 
 TEST_F(FederatedProviderFetcherTest, InvalidCrossOriginSigninUrl) {
-  feature_list_.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled);
-
   FederatedProviderFetcher::FetchResult result;
   result.endpoints.accounts = GURL("https://idp.example/accounts");
   result.endpoints.token = GURL("https://idp.example/token");
diff --git a/content/browser/webid/flags.cc b/content/browser/webid/flags.cc
index fd60d46f..69ad149 100644
--- a/content/browser/webid/flags.cc
+++ b/content/browser/webid/flags.cc
@@ -27,13 +27,6 @@
       features::kFedCmMultipleIdentityProviders);
 }
 
-FedCmIdpSigninStatusMode GetFedCmIdpSigninStatusFlag() {
-  if (base::FeatureList::IsEnabled(features::kFedCmIdpSigninStatusEnabled)) {
-    return FedCmIdpSigninStatusMode::ENABLED;
-  }
-  return FedCmIdpSigninStatusMode::METRICS_ONLY;
-}
-
 bool IsFedCmMetricsEndpointEnabled() {
   return base::FeatureList::IsEnabled(features::kFedCmMetricsEndpoint);
 }
diff --git a/content/browser/webid/flags.h b/content/browser/webid/flags.h
index 5784993..601466e 100644
--- a/content/browser/webid/flags.h
+++ b/content/browser/webid/flags.h
@@ -24,11 +24,6 @@
 // Whether multiple identity providers are enabled.
 bool IsFedCmMultipleIdentityProvidersEnabled();
 
-// Returns the IdpSigninStatus API mode.
-// Most callers should use webid::GetIdpSigninStatusMode() in webid_utils.h
-// instead, as that version takes origin trial status into account.
-FedCmIdpSigninStatusMode GetFedCmIdpSigninStatusFlag();
-
 // Whether metrics endpoint is enabled.
 bool IsFedCmMetricsEndpointEnabled();
 
diff --git a/content/browser/webid/webid_browsertest.cc b/content/browser/webid/webid_browsertest.cc
index 067a2cad..9232ad4 100644
--- a/content/browser/webid/webid_browsertest.cc
+++ b/content/browser/webid/webid_browsertest.cc
@@ -423,8 +423,6 @@
 class WebIdIdpSigninStatusBrowserTest : public WebIdBrowserTest {
  public:
   void SetUpCommandLine(base::CommandLine* command_line) override {
-    scoped_feature_list_.InitAndEnableFeature(
-        features::kFedCmIdpSigninStatusEnabled);
     command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
   }
 
@@ -440,9 +438,7 @@
  public:
   void SetUpCommandLine(base::CommandLine* command_line) override {
     scoped_feature_list_.InitWithFeatures(
-        {features::kFedCmIdpSigninStatusEnabled,
-         blink::features::kKeepAliveInBrowserMigration},
-        {});
+        {blink::features::kKeepAliveInBrowserMigration}, {});
     command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
   }
 
diff --git a/content/browser/webid/webid_utils.cc b/content/browser/webid/webid_utils.cc
index f437b4e..6959f54 100644
--- a/content/browser/webid/webid_utils.cc
+++ b/content/browser/webid/webid_utils.cc
@@ -393,13 +393,6 @@
   }
 }
 
-FedCmIdpSigninStatusMode GetIdpSigninStatusMode(RenderFrameHost& host,
-                                                const url::Origin& idp_origin) {
-  // TODO(crbug.com/40283354): Remove this function in favor of
-  // GetFedCmIdpSigninStatusFlag.
-  return GetFedCmIdpSigninStatusFlag();
-}
-
 std::string FormatUrlForDisplay(const GURL& url) {
   // We do not use url_formatter::FormatUrlForSecurityDisplay() directly because
   // our UI intentionally shows only the eTLD+1, as it makes for a shorter text
diff --git a/content/browser/webid/webid_utils.h b/content/browser/webid/webid_utils.h
index 5276b95..d797646 100644
--- a/content/browser/webid/webid_utils.h
+++ b/content/browser/webid/webid_utils.h
@@ -86,9 +86,6 @@
 CONTENT_EXPORT std::string GetDisconnectConsoleErrorMessage(
     FedCmDisconnectStatus disconnect_status_for_metrics);
 
-FedCmIdpSigninStatusMode GetIdpSigninStatusMode(RenderFrameHost& host,
-                                                const url::Origin& idp_origin);
-
 // Returns the eTLD+1 for a given url. For localhost, returns the host.
 std::string FormatUrlForDisplay(const GURL& url);
 
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index c4acaa4..7730326 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -217,9 +217,6 @@
            kDefault},
           {wf::EnableFedCmIdPRegistration,
            raw_ref(features::kFedCmIdPRegistration), kDefault},
-          {wf::EnableFedCmIdpSigninStatus,
-           raw_ref(features::kFedCmIdpSigninStatusEnabled),
-           kSetOnlyIfOverridden},
           {wf::EnableGamepadMultitouch,
            raw_ref(features::kEnableGamepadMultitouch)},
           {wf::EnableSharedStorageAPI,
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 188ba92..140b6111 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
@@ -33,6 +33,17 @@
     "ServiceWorker.FetchEvent.MainResource.RaceNetworkRequest";
 const char kSubresourceHistogramForRaceNetworkFetchEvent[] =
     "ServiceWorker.FetchEvent.Subresource.RaceNetworkRequest";
+
+void RecordRaceNetworkRequestCloningResponseForFetchHandlerHistogram(
+    bool is_main_resource,
+    bool is_cloning_data_finished_before_response_complete) {
+  base::UmaHistogramBoolean(
+      base::StrCat({is_main_resource
+                        ? kMainResourceHistogramForRaceNetworkFetchEvent
+                        : kSubresourceHistogramForRaceNetworkFetchEvent,
+                    ".IsCloningDataFinishedBeforeResponseComplete"}),
+      is_cloning_data_finished_before_response_complete);
+}
 }  // namespace
 
 ServiceWorkerRaceNetworkRequestURLLoaderClient::
@@ -382,6 +393,9 @@
     // ServiceWorkerStaticRouterRaceNetworkRequestPerformanceImprovement feature
     // is enabled.
     forwarding_client_->OnComplete(completion_status_.value());
+    RecordRaceNetworkRequestCloningResponseForFetchHandlerHistogram(
+        is_main_resource_,
+        /*is_cloning_data_finished_before_response_complete=*/true);
   }
 }
 
@@ -445,7 +459,6 @@
                          TRACE_ID_LOCAL(this),
                          TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
                          "url", request_.url, "read_data_result", read_result);
-  RecordMojoResultForDataTransfer(read_result, "Read");
   switch (read_result) {
     case MOJO_RESULT_OK:
       write_buffer_manager_for_race_network_request_.ArmOrNotify();
@@ -482,7 +495,6 @@
     // If both data pipes are watched, write data to both pipes. Cancel writing
     // process if one of them is failed.
     result = write_buffer_manager_for_race_network_request_.BeginWriteData();
-    RecordMojoResultForWrite(result);
     switch (result) {
       case MOJO_RESULT_OK:
         break;
@@ -499,7 +511,6 @@
         return;
     }
     result = write_buffer_manager_for_fetch_handler_.BeginWriteData();
-    RecordMojoResultForWrite(result);
     switch (result) {
       case MOJO_RESULT_OK:
         break;
@@ -541,7 +552,6 @@
     // If the data pipe for RaceNetworkRequest is the only watcher, don't write
     // data to the data pipe for the fetch handler.
     result = write_buffer_manager_for_race_network_request_.BeginWriteData();
-    RecordMojoResultForWrite(result);
     switch (result) {
       case MOJO_RESULT_OK:
         break;
@@ -561,7 +571,6 @@
     // If the data pipe for the fetch handler is the only watcher, don't write
     // data to the data pipe for RaceNetworkRequest.
     result = write_buffer_manager_for_fetch_handler_.BeginWriteData();
-    RecordMojoResultForWrite(result);
     switch (result) {
       case MOJO_RESULT_OK:
         break;
@@ -590,7 +599,6 @@
     return false;
   }
 
-  RecordMojoResultForDataTransfer(result, "Initial");
   if (result != MOJO_RESULT_OK) {
     return false;
   }
@@ -598,11 +606,6 @@
   return true;
 }
 
-void ServiceWorkerRaceNetworkRequestURLLoaderClient::RecordMojoResultForWrite(
-    MojoResult result) {
-  RecordMojoResultForDataTransfer(result, "WriteForRaceNetworkRequset");
-}
-
 void ServiceWorkerRaceNetworkRequestURLLoaderClient::CompleteReadData(
     uint32_t num_bytes_to_consume) {
   CHECK(read_buffer_manager_.has_value());
@@ -659,16 +662,6 @@
       fetch_handler_end_time_.value() - response_received_time_.value());
 }
 
-void ServiceWorkerRaceNetworkRequestURLLoaderClient::
-    RecordMojoResultForDataTransfer(MojoResult result,
-                                    const std::string& suffix) {
-  base::UmaHistogramEnumeration(
-      base::StrCat({"ServiceWorker.FetchEvent",
-                    is_main_resource_ ? ".MainResource" : ".Subresource",
-                    ".RaceNetworkRequest.DataTransfer.", suffix}),
-      ConvertMojoResultForUMA(result));
-}
-
 void ServiceWorkerRaceNetworkRequestURLLoaderClient::CloneResponse() {
   simple_buffer_manager_->Clone(
       write_buffer_manager_for_race_network_request_.ReleaseProducerHandle(),
@@ -710,6 +703,9 @@
     // completed as well.
     forwarding_client_->OnComplete(completion_status_.value());
     write_buffer_manager_for_fetch_handler_.ResetProducer();
+    RecordRaceNetworkRequestCloningResponseForFetchHandlerHistogram(
+        is_main_resource_,
+        /*is_cloning_data_finished_before_response_complete=*/false);
   }
 }
 
diff --git a/content/common/service_worker/race_network_request_url_loader_client.h b/content/common/service_worker/race_network_request_url_loader_client.h
index a1979d30..d21fa0a 100644
--- a/content/common/service_worker/race_network_request_url_loader_client.h
+++ b/content/common/service_worker/race_network_request_url_loader_client.h
@@ -215,9 +215,6 @@
   // Record the time between the response received time and the fetch handler
   // end time iff both events are already reached.
   void MaybeRecordResponseReceivedToFetchHandlerEndTiming();
-  void RecordMojoResultForDataTransfer(MojoResult result,
-                                       const std::string& suffix);
-  void RecordMojoResultForWrite(MojoResult result);
 
   void SetFetchHandlerEndTiming(base::TimeTicks fetch_handler_end_time,
                                 bool is_fallback);
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 8bd05e12..3beceea9f 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -440,14 +440,6 @@
              "FedCmIdPregistration",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Enables the IDP signin status API for use with FedCM, including avoiding
-// network requests when not signed in and mismatch handling.
-// When turned off, Login-Status headers are still parsed and processed
-// and FedCM mismatch metrics are collected.
-BASE_FEATURE(kFedCmIdpSigninStatusEnabled,
-             "FedCmIdpSigninStatusEnabled",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Enables usage of the FedCM API with metrics endpoint at the same time.
 BASE_FEATURE(kFedCmMetricsEndpoint,
              "FedCmMetricsEndpoint",
@@ -719,7 +711,7 @@
 // Please see crbug.com/40946257 for more details.
 BASE_FEATURE(kPrefetchBrowserInitiatedTriggers,
              "PrefetchBrowserInitiatedTriggers",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enables exposure of ads APIs in the renderer: Attribution Reporting,
 // FLEDGE, Topics, along with a number of other features actively in development
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 28e817b..aac7f31 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -113,7 +113,6 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmButtonMode);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmDelegation);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmIdPRegistration);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmIdpSigninStatusEnabled);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmMetricsEndpoint);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmMultipleIdentityProviders);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmSelectiveDisclosure);
diff --git a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
index edd3a1a..1d6ba997 100644
--- a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
@@ -214,10 +214,10 @@
 crbug.com/329138770 [ win graphite-enabled ] WebGPUCachingTraceTest_RenderPipelineIncognito [ Failure ]
 
 # Fail or flaky on Windows and Linux. Flaky timeout on Mac.
-crbug.com/371949935 [ graphite-disabled win10 ] TraceTest_ViewTransitionsCapture [ Failure ]
+crbug.com/371949935 [ debug-x64 graphite-disabled nvidia-0x2184 nvidia_lt_535.183.01 target-cpu-64 win10 ] TraceTest_ViewTransitionsCapture [ Failure ]
+crbug.com/371949935 [ graphite-disabled intel-0x9bc5 release-x64 target-cpu-64 win10 ] TraceTest_ViewTransitionsCapture [ Failure ]
 crbug.com/371949935 [ graphite-enabled no-clang-coverage qualcomm-0x41333430 release target-cpu-64 win11 ] TraceTest_ViewTransitionsCapture [ Failure ]
 crbug.com/371949935 [ angle-opengl debug display-server-x linux no-clang-coverage nvidia-0x2184 nvidia_lt_535.183.01 renderer-skia-gl ] TraceTest_ViewTransitionsCapture [ Failure ]
-crbug.com/371949935 [ angle-opengles display-server-wayland intel-0x9bc5 linux mesa_ge_23.2 no-clang-coverage release renderer-skia-gl ] TraceTest_ViewTransitionsCapture [ Failure ]
 crbug.com/371949935 [ angle-metal apple graphite-enabled mac-arm64 no-asan no-clang-coverage release sonoma ] TraceTest_ViewTransitionsCapture [ Failure ]
 crbug.com/371949935 [ intel mac mac-x86_64 no-asan release ] TraceTest_ViewTransitionsCapture [ Failure ]
 
diff --git a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
index 06ba772b..078793f 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
@@ -153,9 +153,6 @@
 # Same with prefer-hardware
 crbug.com/371802469 [ mac intel ] WebCodecs_EncodeDecode_camera_hvc1.1.6.L123.00_prefer-hardware [ Failure ]
 crbug.com/371802469 [ mac intel ] WebCodecs_Encode_camera_hvc1.1.6.L123.00_prefer-hardware [ Failure ]
-crbug.com/379673339 [ win amd-0x7340 angle-d3d11 ] WebCodecs_Encode_offscreen_avc1.42001E_prefer-hardware [ Failure ]
-crbug.com/379673339 [ win amd-0x7340 angle-d3d11 ] WebCodecs_Encode_offscreen_avc1.64001E_prefer-hardware [ Failure ]
-crbug.com/379673339 [ win amd-0x7340 angle-d3d11 ] WebCodecs_Encode_offscreen_hvc1.1.6.L123.00_prefer-hardware [ Failure ]
 
 #######################################################################
 # Automated Entries After This Point - Do Not Manually Add Below Here #
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index c320d8f..5d38c0a 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -478,8 +478,8 @@
 crbug.com/1490427 [ fuchsia fuchsia-board-qemu-x64 ] conformance/textures/misc/texture-srgb-upload.html [ Failure ]
 crbug.com/1490427 [ fuchsia fuchsia-board-qemu-x64 ] conformance/textures/misc/texture-video-transparent.html [ Failure ]
 crbug.com/1490427 [ fuchsia fuchsia-board-qemu-x64 ] conformance/textures/misc/tex-video-using-tex-unit-non-zero.html [ Failure ]
-crbug.com/1490427 [ fuchsia web-engine-shell ] conformance/canvas/drawingbuffer-static-canvas-test.html [ Failure ]
-crbug.com/1490427 [ fuchsia web-engine-shell ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ]
+crbug.com/1490427 [ angle-vulkan arm fuchsia web-engine-shell ] conformance/canvas/drawingbuffer-static-canvas-test.html [ Failure ]
+crbug.com/1490427 [ angle-vulkan arm fuchsia web-engine-shell ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ]
 
 # flaky and worth retrying.
 crbug.com/1490427 [ fuchsia fuchsia-board-sherlock ] conformance/state/gl-object-get-calls.html [ RetryOnFailure ]
diff --git a/ios/chrome/browser/autofill/ui_bundled/chrome_autofill_client_ios.mm b/ios/chrome/browser/autofill/ui_bundled/chrome_autofill_client_ios.mm
index b01ac04..a2693a3b 100644
--- a/ios/chrome/browser/autofill/ui_bundled/chrome_autofill_client_ios.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/chrome_autofill_client_ios.mm
@@ -19,10 +19,10 @@
 #import "base/strings/string_util.h"
 #import "base/strings/sys_string_conversions.h"
 #import "base/strings/utf_string_conversions.h"
-#import "components/autofill/core/browser/autofill_plus_address_delegate.h"
 #import "components/autofill/core/browser/crowdsourcing/votes_uploader.h"
 #import "components/autofill/core/browser/form_import/addresses/autofill_save_update_address_profile_delegate_ios.h"
 #import "components/autofill/core/browser/form_import/form_data_importer.h"
+#import "components/autofill/core/browser/integrators/autofill_plus_address_delegate.h"
 #import "components/autofill/core/browser/logging/log_manager.h"
 #import "components/autofill/core/browser/logging/log_router.h"
 #import "components/autofill/core/browser/payments/payments_network_interface.h"
diff --git a/ios/chrome/browser/ui/authentication/account_menu/BUILD.gn b/ios/chrome/browser/ui/authentication/account_menu/BUILD.gn
index b4d09a8..327a455 100644
--- a/ios/chrome/browser/ui/authentication/account_menu/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/account_menu/BUILD.gn
@@ -120,6 +120,7 @@
     "//ios/chrome/browser/settings/ui_bundled/cells",
     "//ios/chrome/browser/settings/ui_bundled/sync",
     "//ios/chrome/browser/shared/coordinator/scene:scene_state_header",
+    "//ios/chrome/browser/shared/coordinator/scene/test",
     "//ios/chrome/browser/shared/model/application_context",
     "//ios/chrome/browser/shared/model/browser/test:test_support",
     "//ios/chrome/browser/shared/model/profile/test",
diff --git a/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator_unittests.mm b/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator_unittests.mm
index 8e554eb..ccf770e 100644
--- a/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator_unittests.mm
+++ b/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator_unittests.mm
@@ -12,6 +12,7 @@
 #import "components/trusted_vault/trusted_vault_server_constants.h"
 #import "ios/chrome/browser/settings/ui_bundled/sync/sync_encryption_passphrase_table_view_controller.h"
 #import "ios/chrome/browser/shared/coordinator/scene/scene_state.h"
+#import "ios/chrome/browser/shared/coordinator/scene/test/stub_browser_provider_interface.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
 #import "ios/chrome/browser/shared/model/browser/test/test_browser.h"
 #import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
@@ -87,6 +88,14 @@
     profile_ = std::move(builder).Build();
     browser_ = std::make_unique<TestBrowser>(profile_.get(), scene_state_);
 
+    stub_browser_interface_provider_ =
+        [[StubBrowserProviderInterface alloc] init];
+    stub_browser_interface_provider_.mainBrowserProvider.browser =
+        browser_.get();
+    scene_state_mock_ = OCMPartialMock(scene_state_);
+    OCMStub([scene_state_mock_ browserProviderInterface])
+        .andReturn(stub_browser_interface_provider_);
+
     mock_application_commands_handler_ =
         OCMStrictProtocolMock(@protocol(ApplicationCommands));
     mock_snackbar_commands_handler_ =
@@ -182,6 +191,9 @@
   id<SettingsCommands> mock_settings_commands_handler_;
   id<BrowserCommands> mock_browser_commands_handler_;
   SceneState* scene_state_;
+  // Partial mock for stubbing scene_state_'s methods
+  id scene_state_mock_;
+  StubBrowserProviderInterface* stub_browser_interface_provider_;
   id<BrowserCoordinatorCommands> mock_browser_coordinator_commands_handler_;
   AccountMenuViewController* view_controller_;
   AccountMenuMediator* mediator_;
diff --git a/ios/chrome/browser/ui/authentication/change_profile/BUILD.gn b/ios/chrome/browser/ui/authentication/change_profile/BUILD.gn
index 852fe77..ed30961 100644
--- a/ios/chrome/browser/ui/authentication/change_profile/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/change_profile/BUILD.gn
@@ -19,7 +19,8 @@
     "//ios/chrome/app/profile",
     "//ios/chrome/browser/shared/coordinator/scene:scene_state_header",
     "//ios/chrome/browser/shared/model/application_context",
-    "//ios/chrome/browser/shared/ui/util:snackbar_util",
+    "//ios/chrome/browser/signin/model:authentication_service",
+    "//ios/chrome/browser/signin/model:authentication_service_factory",
     "//ios/chrome/browser/ui/authentication/signin:signin_headers",
   ]
 }
diff --git a/ios/chrome/browser/ui/authentication/change_profile/change_profile_signout_continuation.h b/ios/chrome/browser/ui/authentication/change_profile/change_profile_signout_continuation.h
index e3f6969d..d7710e4 100644
--- a/ios/chrome/browser/ui/authentication/change_profile/change_profile_signout_continuation.h
+++ b/ios/chrome/browser/ui/authentication/change_profile/change_profile_signout_continuation.h
@@ -22,8 +22,8 @@
                     (signin_metrics::ProfileSignout)signoutSourceMetric
                              forceClearData:(BOOL)forceClearData
                    forceSnackbarOverToolbar:(BOOL)forceSnackbarOverToolbar
-                            snackbarMessage:
-                                (MDCSnackbarMessage*)snackbarMessage;
+                            snackbarMessage:(MDCSnackbarMessage*)snackbarMessage
+                          signoutCompletion:(ProceduralBlock)signoutCompletion;
 
 @end
 
diff --git a/ios/chrome/browser/ui/authentication/change_profile/change_profile_signout_continuation.mm b/ios/chrome/browser/ui/authentication/change_profile/change_profile_signout_continuation.mm
index 4ebf303a..4e3068c 100644
--- a/ios/chrome/browser/ui/authentication/change_profile/change_profile_signout_continuation.mm
+++ b/ios/chrome/browser/ui/authentication/change_profile/change_profile_signout_continuation.mm
@@ -8,6 +8,10 @@
 #import "ios/chrome/browser/shared/model/browser/browser.h"
 #import "ios/chrome/browser/shared/model/browser/browser_provider.h"
 #import "ios/chrome/browser/shared/model/browser/browser_provider_interface.h"
+#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
+#import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
+#import "ios/chrome/browser/signin/model/authentication_service.h"
+#import "ios/chrome/browser/signin/model/authentication_service_factory.h"
 #import "ios/chrome/browser/ui/authentication/signin/signin_utils.h"
 
 @implementation ChangeProfileSignoutContinuation {
@@ -15,20 +19,22 @@
   BOOL _forceClearData;
   BOOL _forceSnackbarOverToolbar;
   MDCSnackbarMessage* _snackbarMessage;
+  ProceduralBlock _signoutCompletion;
 }
 
 - (instancetype)initWithSignoutSourceMetric:
                     (signin_metrics::ProfileSignout)signoutSourceMetric
                              forceClearData:(BOOL)forceClearData
                    forceSnackbarOverToolbar:(BOOL)forceSnackbarOverToolbar
-                            snackbarMessage:
-                                (MDCSnackbarMessage*)snackbarMessage {
+                            snackbarMessage:(MDCSnackbarMessage*)snackbarMessage
+                          signoutCompletion:(ProceduralBlock)signoutCompletion {
   self = [super init];
   if (self) {
     _signoutSourceMetric = signoutSourceMetric;
     _forceClearData = forceClearData;
     _forceSnackbarOverToolbar = forceSnackbarOverToolbar;
     _snackbarMessage = snackbarMessage;
+    _signoutCompletion = signoutCompletion;
   }
   return self;
 }
@@ -40,7 +46,35 @@
   Browser* browser =
       sceneState.browserProviderInterface.mainBrowserProvider.browser;
   CHECK(browser);
-  // TODO(crbug.com/375605174): Complete the sign-out action.
+
+  id<SnackbarCommands> snackbarCommandsHandler =
+      HandlerForProtocol(browser->GetCommandDispatcher(), SnackbarCommands);
+  AuthenticationService* authenticationService =
+      AuthenticationServiceFactory::GetForProfile(browser->GetProfile());
+
+  BOOL forceSnackbarOverToolbar = _forceSnackbarOverToolbar;
+  MDCSnackbarMessage* snackbarMessage = _snackbarMessage;
+  ProceduralBlock signoutCompletion = _signoutCompletion;
+
+  authenticationService->SignOut(_signoutSourceMetric, _forceClearData, ^{
+    if (forceSnackbarOverToolbar) {
+      [snackbarCommandsHandler
+          showSnackbarMessageOverBrowserToolbar:snackbarMessage];
+    } else {
+      [snackbarCommandsHandler showSnackbarMessage:snackbarMessage
+                                      bottomOffset:0];
+    }
+    if (signoutCompletion) {
+      signoutCompletion();
+    }
+  });
+
+  signin_metrics::RecordSignoutForceClearDataChoice(_forceClearData);
+  signin_metrics::RecordSignoutUserAction(_forceClearData);
+
+  if (completion) {
+    completion();
+  }
 }
 
 @end
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_utils.mm b/ios/chrome/browser/ui/authentication/signin/signin_utils.mm
index 7372804..d7ead94 100644
--- a/ios/chrome/browser/ui/authentication/signin/signin_utils.mm
+++ b/ios/chrome/browser/ui/authentication/signin/signin_utils.mm
@@ -382,7 +382,8 @@
                                           signout_source
                        forceClearData:force_clear_data
              forceSnackbarOverToolbar:force_snackbar_over_toolbar
-                      snackbarMessage:snackbar_message];
+                      snackbarMessage:snackbar_message
+                    signoutCompletion:signout_completion];
 
   BOOL should_switch_profile_at_signout =
       AreSeparateProfilesForManagedAccountsEnabled() &&
@@ -392,7 +393,6 @@
   SceneState* scene_state = browser->GetSceneState();
 
   if (!should_switch_profile_at_signout) {
-    // TODO(crbug.com/375605174): Pass signout_completion to the continuation.
     [signout_continuation executeWithSceneState:scene_state completion:nil];
     return;
   }
diff --git a/ios/chrome/browser/ui/authentication/signout_action_sheet/BUILD.gn b/ios/chrome/browser/ui/authentication/signout_action_sheet/BUILD.gn
index ef1ba49..fb54fe6d 100644
--- a/ios/chrome/browser/ui/authentication/signout_action_sheet/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/signout_action_sheet/BUILD.gn
@@ -31,6 +31,7 @@
     "//ios/chrome/browser/signin/model:system_identity",
     "//ios/chrome/browser/sync/model",
     "//ios/chrome/browser/ui/authentication",
+    "//ios/chrome/browser/ui/authentication/signin:signin_headers",
     "//ios/third_party/material_components_ios",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/authentication/signout_action_sheet/signout_action_sheet_coordinator.mm b/ios/chrome/browser/ui/authentication/signout_action_sheet/signout_action_sheet_coordinator.mm
index ee402d6d..d70b9c4 100644
--- a/ios/chrome/browser/ui/authentication/signout_action_sheet/signout_action_sheet_coordinator.mm
+++ b/ios/chrome/browser/ui/authentication/signout_action_sheet/signout_action_sheet_coordinator.mm
@@ -33,6 +33,7 @@
 #import "ios/chrome/browser/sync/model/enterprise_utils.h"
 #import "ios/chrome/browser/sync/model/sync_service_factory.h"
 #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h"
+#import "ios/chrome/browser/ui/authentication/signin/signin_utils.h"
 #import "ios/chrome/grit/ios_branded_strings.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ui/base/l10n/l10n_util_mac.h"
@@ -592,9 +593,20 @@
   [self preventUserInteraction];
   id<SnackbarCommands> snackbarCommandsHandler = HandlerForProtocol(
       self.browser->GetCommandDispatcher(), SnackbarCommands);
+  // Prepare the signout snackbar before account switching.
   // The snackbar message might be nil if the snackbar is not needed.
   MDCSnackbarMessage* snackbarMessage = [self signoutSnackbarMessage];
+
   __weak __typeof(self) weakSelf = self;
+  if (AreSeparateProfilesForManagedAccountsEnabled()) {
+    signin::MultiProfileSignOut(self.browser, _signout_source_metric,
+                                forceClearData, _forceSnackbarOverToolbar,
+                                snackbarMessage, ^{
+                                  [weakSelf signOutDidFinish];
+                                });
+    return;
+  }
+
   BOOL forceSnackbarOverToolbar = _forceSnackbarOverToolbar;
   self.authenticationService->SignOut(_signout_source_metric, forceClearData, ^{
     // The snackbar should be displayed even if self has been deallocated.
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
index 6494427b..36fe812 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-ac145ecbffc320a10b345cd60ee45e270d3ecbde
\ No newline at end of file
+6f7e33f92cb443f525d88a0e951d7ee3e1179e75
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
index 264df35..fedcb51 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-48a78645b352dc4c6a97d147152ca8eb9a4d6c2c
\ No newline at end of file
+909e2e89d870d40494608f803c76f9e4e6af8876
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index f1b7b849..c4f05e4 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-da57c5e92ae0d086dd9fa5e99af24367a5fc9257
\ No newline at end of file
+a947c7529933737db114d30ef02d7a204d9bc27a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
index 923fb85..5bf0025 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-9b182f8bd33ca398d5e784d22332df06e47ea3c8
\ No newline at end of file
+342c5a2089a31ebdf0b4a82f2423363856ba9308
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index d43c0c3f..82775a3 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-4515aa9903de8a3f276bd9650afd1c763256f71e
\ No newline at end of file
+ae02f6b2d25cfed3ce7e63b01b1043a26fed12f2
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
index 2e40db2d..90d7931c 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-d0a79409556ed5a4fd19b1878d5327c782aefee3
\ No newline at end of file
+8ed37665c1e2016fc631d217aa92591c6f058e20
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
index b9eddaa..c4e17ac 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-8581dec5423fc3eff8ec65c0883cefc80d0e693c
\ No newline at end of file
+d1b2fd4016ca5c3a2f2baa67258da350d1c50573
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
index 9ccc8f6..dd0cb99f 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-b800d87afd84e843aba3b51ee86dc7db554cdc11
\ No newline at end of file
+9b4c939a609fd9b6339a8482abc5ad78068b6e89
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
index 42769f69..32463ef 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-511bcf9d5be7e483c4ef7382e7a5ac6b2aa3fda2
\ No newline at end of file
+fb1d529dfeff793bf5ab462f2006fc10b444307e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
index c76e4344..8ce293b 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-754b77224708cf7c33f0d74d18556671ede1e6f6
\ No newline at end of file
+947dbce4920da5471dd5bcf828842b76ab8c9597
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 3964563..898c0b0 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-c022b14e86987c17f60016aea9f00de949171883
\ No newline at end of file
+9c205dc7063142bdad21467e648179ae5af2d938
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
index 89134bcc..01f91093 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-1ed0d19a93bd157cea5b2fabd99ab95cb4f98cb1
\ No newline at end of file
+a18d85c77d93414b47f9d09f61010d6ac894068d
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 8ad00e1..70bb454 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-8c20c9fb4fd55f9a8520c6d1774cd74680823996
\ No newline at end of file
+bdf7355bbf22aaa9dd3b0bbe1fbd2a8e5364b305
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 9ddb753..80729e9 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-7e917f1513a2e90320651425e4f2092991a963ab
\ No newline at end of file
+572012f485b976944d4275fddd07b1c591edc98d
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index c7154fc0..9842761 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-3f6a5073e575f83676e1a8861dcf9ad9adeb2c97
\ No newline at end of file
+2c27e9b91442a743e1bced7d2ee3006ec7d0860b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
index f0779a3..5d49fe7 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-46b266629abdac769a96be6c85ae926570f8245a
\ No newline at end of file
+87556d1df5c41710bb37b6356c79bfac245b07a5
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index fec5486b..1ab565e 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-0390d29566d8fc56d6cc72bd066435d9aa23576e
\ No newline at end of file
+33dc4d3add2d4f8a3251a7918426f35317252fad
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 42b692f..a24e37b7 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-5501eeabbfc583c0579940ec1f965963cbf220f5
\ No newline at end of file
+902cbdc9f52cb700b87134b259b0db7881205262
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index ae8bb45..a2ffea0 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-91878e27c7d26e583165f85520b70d7c35095151
\ No newline at end of file
+1d792151c7a1b572abed80c513a8202b0545b5f1
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 4c565e4..9e4b8b1 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-7655a1d6a1a5297da665a7d5195abc0438fdc115
\ No newline at end of file
+e96bebf3551350440626adaa275636e9425479c8
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 32dcaf86..2a3e9a6c 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-3e5b06ffb359ff08f94e2cef26bb3cef3420c010
\ No newline at end of file
+f490371233c2e724f4636da678c733989d91a6ac
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
index 8df98f8..1048e6d 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-a909d33310a9b8b062dcd3563ab5804d2b8abd60
\ No newline at end of file
+a5dc2901a3c0e815352ccf4b3ae12aa2b2907924
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 50b6899d..fc23bdef 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-a769854c077b435f36ccb32655669355695e0309
\ No newline at end of file
+bc91a4276ed15ac0d4bed6d789302d4696e9b58a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 6cd4253..fe394fa1f 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-2957a3e3bb41d25e3ef175ba7dd2c68956f62743
\ No newline at end of file
+f2e056002e2fcaee1c21cd29858a9a31cb9a2741
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index 0f80f5a..fda37a86 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-2a62ec8545d4370a06dbf7caf7b99e2865672d01
\ No newline at end of file
+c4dda953bbbdad9aaae658025dcb71f5a6116d49
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
index 7b794c0..ef7cabd 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-1dc7ff4f22df2d32c34f1eb94f89f3062b3b88bb
\ No newline at end of file
+70b289dd3a10135ba17d1a25816a67ef1a675cbd
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index f0a02a24..06a5f117 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-4cd74b7fccca6ab26c73ecae307e0db28e003a69
\ No newline at end of file
+f9cdd9a16e6797031f132557c1442b280d1a3c6a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 9e4dcc0..c1aa7e3 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-0e88a253cd07d33fe422f198fcd3f2e11edf3637
\ No newline at end of file
+98f6aefd4b5318a96cd8daa62290a2b02e7acc55
\ No newline at end of file
diff --git a/net/http/http_stream_pool_job.cc b/net/http/http_stream_pool_job.cc
index 1e755bc2..19c4c79 100644
--- a/net/http/http_stream_pool_job.cc
+++ b/net/http/http_stream_pool_job.cc
@@ -80,8 +80,7 @@
         CreateToResumeTime());
 
     if (*result_ != OK) {
-      base::UmaHistogramSparse("Net.NetworkTransaction.JobErrorCode",
-                               -*result_);
+      base::UmaHistogramSparse("Net.HttpStreamPool.JobErrorCode", -*result_);
     }
   }
 
diff --git a/net/third_party/quiche/src b/net/third_party/quiche/src
index 2f180e1..981c424 160000
--- a/net/third_party/quiche/src
+++ b/net/third_party/quiche/src
@@ -1 +1 @@
-Subproject commit 2f180e16310126c4fc945d52f478c5c7c8411703
+Subproject commit 981c424462d9e5210dc843e92b325c93d3bee4e9
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 41ab59e..95a07fd 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3686,27 +3686,6 @@
             ]
         }
     ],
-    "CSSLazyParsingFastPath": [
-        {
-            "platforms": [
-                "android",
-                "android_weblayer",
-                "android_webview",
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "CSSLazyParsingFastPath"
-                    ]
-                }
-            ]
-        }
-    ],
     "CVDisplayLinkBeginFrameSource": [
         {
             "platforms": [
@@ -10852,6 +10831,25 @@
             ]
         }
     ],
+    "HappyEyeballsV3": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "HappyEyeballsV3"
+                    ]
+                }
+            ]
+        }
+    ],
     "HatsArcGames": [
         {
             "platforms": [
@@ -18873,21 +18871,6 @@
             ]
         }
     ],
-    "RefreshTokenV3Feature": [
-        {
-            "platforms": [
-                "chromeos"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "RefreshTokenV3Feature"
-                    ]
-                }
-            ]
-        }
-    ],
     "RegisterOsUpdateHandlerWin": [
         {
             "platforms": [
diff --git a/third_party/angle b/third_party/angle
index db8e561..7fb481a 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit db8e5617bafaa8374b0cd2465de3fce54622f00e
+Subproject commit 7fb481a64d71d87b183d54352d983caa772d0182
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni
index 05b8fe3..0fa149cc 100644
--- a/third_party/blink/renderer/bindings/generated_in_modules.gni
+++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -2448,8 +2448,6 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_keyboard_layout_map.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_khr_parallel_shader_compile.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_khr_parallel_shader_compile.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_language_detector.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_language_detector.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_language_translator.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_language_translator.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_launch_params.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni
index c05b13e9..e63d019 100644
--- a/third_party/blink/renderer/bindings/idl_in_modules.gni
+++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -540,7 +540,6 @@
   "//third_party/blink/renderer/modules/notifications/service_worker_global_scope_notifications.idl",
   "//third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.idl",
   "//third_party/blink/renderer/modules/notifications/timestamp_trigger.idl",
-  "//third_party/blink/renderer/modules/on_device_translation/language_detector.idl",
   "//third_party/blink/renderer/modules/on_device_translation/language_translator.idl",
   "//third_party/blink/renderer/modules/on_device_translation/translation_language_options.idl",
   "//third_party/blink/renderer/modules/on_device_translation/translation.idl",
diff --git a/third_party/blink/renderer/core/css/parser/css_lazy_parsing_test.cc b/third_party/blink/renderer/core/css/parser/css_lazy_parsing_test.cc
index 950bafda..4b180f5 100644
--- a/third_party/blink/renderer/core/css/parser/css_lazy_parsing_test.cc
+++ b/third_party/blink/renderer/core/css/parser/css_lazy_parsing_test.cc
@@ -40,128 +40,116 @@
 };
 
 TEST_F(CSSLazyParsingTest, Simple) {
-  for (const bool fast_path : {false, true}) {
-    ScopedCSSLazyParsingFastPathForTest fast_path_enabled(fast_path);
-    auto* context = MakeGarbageCollected<CSSParserContext>(
-        kHTMLStandardMode, SecureContextMode::kInsecureContext);
-    auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
+  auto* context = MakeGarbageCollected<CSSParserContext>(
+      kHTMLStandardMode, SecureContextMode::kInsecureContext);
+  auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
 
-    String sheet_text = "body { background-color: red; }/*padding1234567890*/";
-    CSSParser::ParseSheet(context, style_sheet, sheet_text,
-                          CSSDeferPropertyParsing::kYes);
-    StyleRule* rule = RuleAt(style_sheet, 0);
-    EXPECT_FALSE(HasParsedProperties(rule));
-    rule->Properties();
-    EXPECT_TRUE(HasParsedProperties(rule));
-  }
+  String sheet_text = "body { background-color: red; }/*padding1234567890*/";
+  CSSParser::ParseSheet(context, style_sheet, sheet_text,
+                        CSSDeferPropertyParsing::kYes);
+  StyleRule* rule = RuleAt(style_sheet, 0);
+  EXPECT_FALSE(HasParsedProperties(rule));
+  rule->Properties();
+  EXPECT_TRUE(HasParsedProperties(rule));
 }
 
 TEST_F(CSSLazyParsingTest, LazyParseBeforeAfter) {
-  for (const bool fast_path : {false, true}) {
-    ScopedCSSLazyParsingFastPathForTest fast_path_enabled(fast_path);
-    auto* context = MakeGarbageCollected<CSSParserContext>(
-        kHTMLStandardMode, SecureContextMode::kInsecureContext);
-    auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
+  auto* context = MakeGarbageCollected<CSSParserContext>(
+      kHTMLStandardMode, SecureContextMode::kInsecureContext);
+  auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
 
-    String sheet_text =
-        "p::before { content: 'foo' } p .class::after { content: 'bar' } "
-        "/*padding1234567890*/";
-    CSSParser::ParseSheet(context, style_sheet, sheet_text,
-                          CSSDeferPropertyParsing::kYes);
+  String sheet_text =
+      "p::before { content: 'foo' } p .class::after { content: 'bar' } "
+      "/*padding1234567890*/";
+  CSSParser::ParseSheet(context, style_sheet, sheet_text,
+                        CSSDeferPropertyParsing::kYes);
 
-    EXPECT_FALSE(HasParsedProperties(RuleAt(style_sheet, 0)));
-    EXPECT_FALSE(HasParsedProperties(RuleAt(style_sheet, 1)));
-  }
+  EXPECT_FALSE(HasParsedProperties(RuleAt(style_sheet, 0)));
+  EXPECT_FALSE(HasParsedProperties(RuleAt(style_sheet, 1)));
 }
 
 // Regression test for crbug.com/660290 where we change the underlying owning
 // document from the StyleSheetContents without changing the UseCounter. This
 // test ensures that the new UseCounter is used when doing new parsing work.
 TEST_F(CSSLazyParsingTest, ChangeDocuments) {
-  for (const bool fast_path : {false, true}) {
-    ScopedCSSLazyParsingFastPathForTest fast_path_enabled(fast_path);
-    auto dummy_holder = std::make_unique<DummyPageHolder>(gfx::Size(500, 500));
-    Page::InsertOrdinaryPageForTesting(&dummy_holder->GetPage());
+  auto dummy_holder = std::make_unique<DummyPageHolder>(gfx::Size(500, 500));
+  Page::InsertOrdinaryPageForTesting(&dummy_holder->GetPage());
 
-    auto* context = MakeGarbageCollected<CSSParserContext>(
-        kHTMLStandardMode, SecureContextMode::kInsecureContext,
-        &dummy_holder->GetDocument());
-    cached_contents_ = MakeGarbageCollected<StyleSheetContents>(context);
-    {
-      auto* sheet = MakeGarbageCollected<CSSStyleSheet>(
-          cached_contents_, dummy_holder->GetDocument());
-      DCHECK(sheet);
+  auto* context = MakeGarbageCollected<CSSParserContext>(
+      kHTMLStandardMode, SecureContextMode::kInsecureContext,
+      &dummy_holder->GetDocument());
+  cached_contents_ = MakeGarbageCollected<StyleSheetContents>(context);
+  {
+    auto* sheet = MakeGarbageCollected<CSSStyleSheet>(
+        cached_contents_, dummy_holder->GetDocument());
+    DCHECK(sheet);
 
-      String sheet_text =
-          "body { background-color: red; } p { color: orange;  "
-          "}/*padding1234567890*/";
-      CSSParser::ParseSheet(context, cached_contents_, sheet_text,
-                            CSSDeferPropertyParsing::kYes);
+    String sheet_text =
+        "body { background-color: red; } p { color: orange;  "
+        "}/*padding1234567890*/";
+    CSSParser::ParseSheet(context, cached_contents_, sheet_text,
+                          CSSDeferPropertyParsing::kYes);
 
-      // Parse the first property set with the first document as owner.
-      StyleRule* rule = RuleAt(cached_contents_, 0);
-      EXPECT_FALSE(HasParsedProperties(rule));
-      rule->Properties();
-      EXPECT_TRUE(HasParsedProperties(rule));
+    // Parse the first property set with the first document as owner.
+    StyleRule* rule = RuleAt(cached_contents_, 0);
+    EXPECT_FALSE(HasParsedProperties(rule));
+    rule->Properties();
+    EXPECT_TRUE(HasParsedProperties(rule));
 
-      EXPECT_EQ(&dummy_holder->GetDocument(),
-                cached_contents_->SingleOwnerDocument());
-      UseCounterImpl& use_counter1 =
-          dummy_holder->GetDocument().Loader()->GetUseCounter();
-      EXPECT_TRUE(
-          use_counter1.IsCounted(CSSPropertyID::kBackgroundColor,
-                                 UseCounterImpl::CSSPropertyType::kDefault));
-      EXPECT_FALSE(use_counter1.IsCounted(
-          CSSPropertyID::kColor, UseCounterImpl::CSSPropertyType::kDefault));
-
-      // Change owner document.
-      cached_contents_->UnregisterClient(sheet);
-      dummy_holder.reset();
-    }
-    // Ensure no stack references to oilpan objects.
-    ThreadState::Current()->CollectAllGarbageForTesting();
-
-    auto dummy_holder2 = std::make_unique<DummyPageHolder>(gfx::Size(500, 500));
-    Page::InsertOrdinaryPageForTesting(&dummy_holder2->GetPage());
-    auto* sheet2 = MakeGarbageCollected<CSSStyleSheet>(
-        cached_contents_, dummy_holder2->GetDocument());
-
-    EXPECT_EQ(&dummy_holder2->GetDocument(),
+    EXPECT_EQ(&dummy_holder->GetDocument(),
               cached_contents_->SingleOwnerDocument());
-
-    // Parse the second property set with the second document as owner.
-    StyleRule* rule2 = RuleAt(cached_contents_, 1);
-    EXPECT_FALSE(HasParsedProperties(rule2));
-    rule2->Properties();
-    EXPECT_TRUE(HasParsedProperties(rule2));
-
-    UseCounterImpl& use_counter2 =
-        dummy_holder2->GetDocument().Loader()->GetUseCounter();
-    EXPECT_TRUE(sheet2);
-    EXPECT_TRUE(use_counter2.IsCounted(
+    UseCounterImpl& use_counter1 =
+        dummy_holder->GetDocument().Loader()->GetUseCounter();
+    EXPECT_TRUE(
+        use_counter1.IsCounted(CSSPropertyID::kBackgroundColor,
+                               UseCounterImpl::CSSPropertyType::kDefault));
+    EXPECT_FALSE(use_counter1.IsCounted(
         CSSPropertyID::kColor, UseCounterImpl::CSSPropertyType::kDefault));
 
-    EXPECT_FALSE(
-        use_counter2.IsCounted(CSSPropertyID::kBackgroundColor,
-                               UseCounterImpl::CSSPropertyType::kDefault));
+    // Change owner document.
+    cached_contents_->UnregisterClient(sheet);
+    dummy_holder.reset();
   }
+  // Ensure no stack references to oilpan objects.
+  ThreadState::Current()->CollectAllGarbageForTesting();
+
+  auto dummy_holder2 = std::make_unique<DummyPageHolder>(gfx::Size(500, 500));
+  Page::InsertOrdinaryPageForTesting(&dummy_holder2->GetPage());
+  auto* sheet2 = MakeGarbageCollected<CSSStyleSheet>(
+      cached_contents_, dummy_holder2->GetDocument());
+
+  EXPECT_EQ(&dummy_holder2->GetDocument(),
+            cached_contents_->SingleOwnerDocument());
+
+  // Parse the second property set with the second document as owner.
+  StyleRule* rule2 = RuleAt(cached_contents_, 1);
+  EXPECT_FALSE(HasParsedProperties(rule2));
+  rule2->Properties();
+  EXPECT_TRUE(HasParsedProperties(rule2));
+
+  UseCounterImpl& use_counter2 =
+      dummy_holder2->GetDocument().Loader()->GetUseCounter();
+  EXPECT_TRUE(sheet2);
+  EXPECT_TRUE(use_counter2.IsCounted(
+      CSSPropertyID::kColor, UseCounterImpl::CSSPropertyType::kDefault));
+
+  EXPECT_FALSE(
+      use_counter2.IsCounted(CSSPropertyID::kBackgroundColor,
+                             UseCounterImpl::CSSPropertyType::kDefault));
 }
 
 TEST_F(CSSLazyParsingTest, NoLazyParsingForNestedRules) {
-  for (const bool fast_path : {false, true}) {
-    ScopedCSSLazyParsingFastPathForTest fast_path_enabled(fast_path);
-    auto* context = MakeGarbageCollected<CSSParserContext>(
-        kHTMLStandardMode, SecureContextMode::kInsecureContext);
-    auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
+  auto* context = MakeGarbageCollected<CSSParserContext>(
+      kHTMLStandardMode, SecureContextMode::kInsecureContext);
+  auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
 
-    String sheet_text = "body { color: green; & div { color: red; } }";
-    CSSParser::ParseSheet(context, style_sheet, sheet_text,
-                          CSSDeferPropertyParsing::kYes);
-    StyleRule* rule = RuleAt(style_sheet, 0);
-    EXPECT_TRUE(HasParsedProperties(rule));
-    EXPECT_EQ("color: green;", rule->Properties().AsText());
-    EXPECT_TRUE(HasParsedProperties(rule));
-  }
+  String sheet_text = "body { color: green; & div { color: red; } }";
+  CSSParser::ParseSheet(context, style_sheet, sheet_text,
+                        CSSDeferPropertyParsing::kYes);
+  StyleRule* rule = RuleAt(style_sheet, 0);
+  EXPECT_TRUE(HasParsedProperties(rule));
+  EXPECT_EQ("color: green;", rule->Properties().AsText());
+  EXPECT_TRUE(HasParsedProperties(rule));
 }
 
 #endif  // SIMD
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
index cdde6c0..1b24938 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
@@ -2535,39 +2535,6 @@
                                 context_->GetDocument()));
 }
 
-// A (hopefully) fast check for whether the given declaration block could
-// contain nested CSS rules. All of these have to involve { in some shape
-// or form, so we simply check for the existence of that. (It means we will
-// have false positives for e.g. { within comments or strings, but this
-// only means we will turn off lazy parsing for that rule, nothing worse.)
-// This will work even for UTF-16, although with some more false positives
-// with certain Unicode characters such as U+017E (LATIN SMALL LETTER Z
-// WITH CARON). This is, again, not a big problem for us.
-static bool MayContainNestedRules(const String& text,
-                                  wtf_size_t offset,
-                                  wtf_size_t length) {
-  if (length < 2u) {
-    // {} is the shortest possible block (but if there's
-    // a lone { and then EOF, we will be called with length 1).
-    return false;
-  }
-
-  // Strip away the outer {} pair (the { would always give us a false positive).
-  DCHECK_EQ(text[offset], '{');
-  if (text[offset + length - 1] != '}') {
-    // EOF within the block, so just be on the safe side
-    // and use the normal (non-lazy) code path.
-    return true;
-  }
-  ++offset;
-  length -= 2;
-
-  size_t char_size = text.Is8Bit() ? sizeof(LChar) : sizeof(UChar);
-  auto text_bytes = base::as_chars(
-      text.RawByteSpan().subspan(offset * char_size, length * char_size));
-  return memchr(text_bytes.data(), '{', text_bytes.size()) != nullptr;
-}
-
 StyleRule* CSSParserImpl::ConsumeStyleRule(CSSParserTokenStream& stream,
                                            CSSNestingType nesting_type,
                                            StyleRule* parent_rule_for_nesting,
@@ -2651,67 +2618,31 @@
     return nullptr;
   }
 
-  if (RuntimeEnabledFeatures::CSSLazyParsingFastPathEnabled()) {
-    // TODO(csharrison): How should we lazily parse css that needs the observer?
-    if (!observer_ && lazy_state_) {
-      DCHECK(style_sheet_);
+  // TODO(csharrison): How should we lazily parse css that needs the observer?
+  if (!observer_ && lazy_state_) {
+    DCHECK(style_sheet_);
 
-      StringView text(stream.RemainingText(), 1);
+    StringView text(stream.RemainingText(), 1);
 #ifdef ARCH_CPU_X86_FAMILY
-      wtf_size_t len;
-      if (base::CPU::GetInstanceNoAllocation().has_avx2()) {
-        len = static_cast<wtf_size_t>(FindLengthOfDeclarationListAVX2(text));
-      } else {
-        len = static_cast<wtf_size_t>(FindLengthOfDeclarationList(text));
-      }
-#else
-      wtf_size_t len =
-          static_cast<wtf_size_t>(FindLengthOfDeclarationList(text));
-#endif
-      if (len != 0) {
-        wtf_size_t block_start_offset = stream.Offset();
-        stream.SkipToEndOfBlock(len + 2);  // +2 for { and }.
-        return StyleRule::Create(selector_vector,
-                                 MakeGarbageCollected<CSSLazyPropertyParser>(
-                                     block_start_offset, lazy_state_));
-      }
+    wtf_size_t len;
+    if (base::CPU::GetInstanceNoAllocation().has_avx2()) {
+      len = static_cast<wtf_size_t>(FindLengthOfDeclarationListAVX2(text));
+    } else {
+      len = static_cast<wtf_size_t>(FindLengthOfDeclarationList(text));
     }
-    CSSParserTokenStream::BlockGuard guard(stream);
-    return ConsumeStyleRuleContents(selector_vector, stream,
-                                    has_visited_pseudo);
-  } else {
-    CSSParserTokenStream::BlockGuard guard(stream);
-
-    // TODO(csharrison): How should we lazily parse css that needs the observer?
-    if (!observer_ && lazy_state_) {
-      DCHECK(style_sheet_);
-
-      wtf_size_t block_start_offset = stream.Offset() - 1;  // - 1 for the {.
-      guard.SkipToEndOfBlock();
-      wtf_size_t block_length = stream.Offset() - block_start_offset;
-
-      // Lazy parsing cannot deal with nested rules. We make a very quick check
-      // to see if there could possibly be any in there; if so, we need to go
-      // back to normal (non-lazy) parsing. If that happens, we've wasted some
-      // work; specifically, the SkipToEndOfBlock(), and potentially that we
-      // cannot use the CachedCSSTokenizer if that would otherwise be in use.
-      if (MayContainNestedRules(lazy_state_->SheetText(), block_start_offset,
-                                block_length)) {
-        CSSParserTokenStream block_stream(lazy_state_->SheetText(),
-                                          block_start_offset);
-        CSSParserTokenStream::BlockGuard sub_guard(
-            block_stream);  // Consume the {, and open the block stack.
-        return ConsumeStyleRuleContents(selector_vector, block_stream,
-                                        has_visited_pseudo);
-      }
-
+#else
+    wtf_size_t len = static_cast<wtf_size_t>(FindLengthOfDeclarationList(text));
+#endif
+    if (len != 0) {
+      wtf_size_t block_start_offset = stream.Offset();
+      stream.SkipToEndOfBlock(len + 2);  // +2 for { and }.
       return StyleRule::Create(selector_vector,
                                MakeGarbageCollected<CSSLazyPropertyParser>(
                                    block_start_offset, lazy_state_));
     }
-    return ConsumeStyleRuleContents(selector_vector, stream,
-                                    has_visited_pseudo);
   }
+  CSSParserTokenStream::BlockGuard guard(stream);
+  return ConsumeStyleRuleContents(selector_vector, stream, has_visited_pseudo);
 }
 
 StyleRule* CSSParserImpl::ConsumeStyleRuleContents(
diff --git a/third_party/blink/renderer/core/editing/commands/editing_state.cc b/third_party/blink/renderer/core/editing/commands/editing_state.cc
index b66aa56..ce27e0dd 100644
--- a/third_party/blink/renderer/core/editing/commands/editing_state.cc
+++ b/third_party/blink/renderer/core/editing/commands/editing_state.cc
@@ -23,11 +23,11 @@
 #if DCHECK_IS_ON()
 // ---
 
-NoEditingAbortChecker::NoEditingAbortChecker(const char* file, int line)
-    : file_(file), line_(line) {}
+NoEditingAbortChecker::NoEditingAbortChecker(const base::Location& location)
+    : location_(std::move(location)) {}
 
 NoEditingAbortChecker::~NoEditingAbortChecker() {
-  DCHECK_AT(!editing_state_.IsAborted(), file_, line_)
+  DCHECK_AT(!editing_state_.IsAborted(), location_)
       << "The operation should not have been aborted.";
 }
 
diff --git a/third_party/blink/renderer/core/editing/commands/editing_state.h b/third_party/blink/renderer/core/editing/commands/editing_state.h
index f965edb..978ba90 100644
--- a/third_party/blink/renderer/core/editing/commands/editing_state.h
+++ b/third_party/blink/renderer/core/editing/commands/editing_state.h
@@ -69,7 +69,8 @@
   STACK_ALLOCATED();
 
  public:
-  NoEditingAbortChecker(const char* file, int line);
+  explicit NoEditingAbortChecker(
+      const base::Location& location = base::Location::Current());
   NoEditingAbortChecker(const NoEditingAbortChecker&) = delete;
   NoEditingAbortChecker& operator=(const NoEditingAbortChecker&) = delete;
   ~NoEditingAbortChecker();
@@ -78,8 +79,7 @@
 
  private:
   EditingState editing_state_;
-  const char* const file_;
-  int const line_;
+  const base::Location location_;
 };
 
 // If a function with EditingState* argument should not be aborted,
@@ -87,8 +87,7 @@
 //    fooFunc(...., ASSERT_NO_EDITING_ABORT);
 // It causes an assertion failure If DCHECK_IS_ON() and the function was aborted
 // unexpectedly.
-#define ASSERT_NO_EDITING_ABORT \
-  (NoEditingAbortChecker(__FILE__, __LINE__).GetEditingState())
+#define ASSERT_NO_EDITING_ABORT (NoEditingAbortChecker().GetEditingState())
 #else
 #define ASSERT_NO_EDITING_ABORT (IgnorableEditingAbortState().GetEditingState())
 #endif
diff --git a/third_party/blink/renderer/core/layout/box_fragment_builder.h b/third_party/blink/renderer/core/layout/box_fragment_builder.h
index d530700..31d2817 100644
--- a/third_party/blink/renderer/core/layout/box_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/box_fragment_builder.h
@@ -153,6 +153,20 @@
     return size_.block_size;
   }
 
+  LogicalSize SizeForAnchorQueries() const {
+    // TODO(layout-dev): This isn't great. But sometimes anchor queries are
+    // evaluated in the middle of layout of an OOF container. This happens when
+    // the OOF container is a multicol container, and column layout gets
+    // interrupted by a column spanner. We should probably provide the multicol
+    // block size we have at the point of being interrupted by the spanner,
+    // rather than using 0.
+    LogicalSize logical_size(InlineSize(), LayoutUnit());
+    if (HasBlockSize()) {
+      logical_size.block_size = FragmentBlockSize();
+    }
+    return logical_size;
+  }
+
   void SetIntrinsicBlockSize(LayoutUnit intrinsic_block_size) {
     intrinsic_block_size_ = intrinsic_block_size;
   }
diff --git a/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc
index 477da50..1dbac4a 100644
--- a/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc
@@ -184,6 +184,7 @@
       is_webkit_box_(Style().IsDeprecatedWebkitBox()),
       is_column_(Style().ResolvedIsColumnFlexDirection()),
       is_wrap_reverse_(Style().FlexWrap() == EFlexWrap::kWrapReverse),
+      is_reverse_direction_(Style().ResolvedIsReverseFlexDirection()),
       is_multi_line_(Style().FlexWrap() != EFlexWrap::kNowrap),
       is_horizontal_flow_(FlexibleBoxAlgorithm::IsHorizontalFlow(Style())),
       is_cross_size_definite_(IsContainerCrossSizeDefinite()),
@@ -214,6 +215,63 @@
   }
 }
 
+StyleContentAlignmentData FlexLayoutAlgorithm::ResolvedJustifyContent() const {
+  if (is_webkit_box_) {
+    const EBoxPack box_pack = Style().BoxPack();
+    const ContentPosition position = ([&]() {
+      // -webkit-box row-reverse currently flips the start/end (e.g. it always
+      // uses "start" rather than "flex-start"). Firefox doesn't have this
+      // quirk, we should attempt to remove it.
+      const bool is_row_reverse = Style().ResolvedIsRowReverseFlexDirection();
+      switch (box_pack) {
+        case EBoxPack::kCenter:
+          return ContentPosition::kCenter;
+        case EBoxPack::kJustify:
+        case EBoxPack::kStart:
+          return is_row_reverse ? ContentPosition::kFlexEnd
+                                : ContentPosition::kFlexStart;
+        case EBoxPack::kEnd:
+          return is_row_reverse ? ContentPosition::kFlexStart
+                                : ContentPosition::kFlexEnd;
+      }
+    })();
+    const ContentDistributionType distribution =
+        box_pack == EBoxPack::kJustify ? ContentDistributionType::kSpaceBetween
+                                       : ContentDistributionType::kDefault;
+    return StyleContentAlignmentData(position, distribution,
+                                     OverflowAlignment::kSafe);
+  }
+
+  const auto writing_direction = GetConstraintSpace().GetWritingDirection();
+  const StyleContentAlignmentData& justify_content = Style().JustifyContent();
+
+  // Coerce "left"/"right" their logical variants.
+  ContentPosition position = justify_content.GetPosition();
+  if (position == ContentPosition::kLeft ||
+      position == ContentPosition::kRight) {
+    if (is_column_) {
+      if (writing_direction.IsHorizontal()) {
+        // The main-axis is in the top-down direction, fallback to start.
+        position = ContentPosition::kStart;
+      } else {
+        LogicalToPhysical physical(
+            writing_direction, ContentPosition::kStart, ContentPosition::kEnd,
+            ContentPosition::kStart, ContentPosition::kEnd);
+        position = position == ContentPosition::kLeft ? physical.Left()
+                                                      : physical.Right();
+      }
+    } else {
+      position =
+          ((position == ContentPosition::kLeft) == writing_direction.IsLtr())
+              ? ContentPosition::kStart
+              : ContentPosition::kEnd;
+    }
+  }
+
+  return StyleContentAlignmentData(position, justify_content.Distribution(),
+                                   justify_content.Overflow());
+}
+
 LayoutUnit FlexLayoutAlgorithm::MainAxisContentExtent(
     LayoutUnit sum_hypothetical_main_size) const {
   if (is_column_) {
@@ -285,28 +343,27 @@
 enum AxisEdge { kStart, kCenter, kEnd };
 
 // Maps the resolved justify-content value to a static-position edge.
-AxisEdge MainAxisStaticPositionEdge(const ComputedStyle& style) {
-  const StyleContentAlignmentData justify =
-      FlexibleBoxAlgorithm::ResolvedJustifyContent(style);
-  const ContentPosition content_position = justify.GetPosition();
-  const bool is_reverse = style.ResolvedIsReverseFlexDirection();
-
+AxisEdge MainAxisStaticPositionEdge(
+    const StyleContentAlignmentData& justify_content,
+    bool is_reverse_direction) {
+  const ContentPosition content_position = justify_content.GetPosition();
   DCHECK_NE(content_position, ContentPosition::kLeft);
   DCHECK_NE(content_position, ContentPosition::kRight);
   if (content_position == ContentPosition::kFlexEnd)
-    return is_reverse ? AxisEdge::kStart : AxisEdge::kEnd;
+    return is_reverse_direction ? AxisEdge::kStart : AxisEdge::kEnd;
 
   if (content_position == ContentPosition::kCenter ||
-      justify.Distribution() == ContentDistributionType::kSpaceAround ||
-      justify.Distribution() == ContentDistributionType::kSpaceEvenly)
+      justify_content.Distribution() == ContentDistributionType::kSpaceAround ||
+      justify_content.Distribution() == ContentDistributionType::kSpaceEvenly) {
     return AxisEdge::kCenter;
+  }
 
   if (content_position == ContentPosition::kStart)
     return AxisEdge::kStart;
   if (content_position == ContentPosition::kEnd)
     return AxisEdge::kEnd;
 
-  return is_reverse ? AxisEdge::kEnd : AxisEdge::kStart;
+  return is_reverse_direction ? AxisEdge::kEnd : AxisEdge::kStart;
 }
 
 // Maps the resolved alignment value to a static-position edge.
@@ -379,10 +436,13 @@
   total_fragment_size =
       ShrinkLogicalSize(total_fragment_size, border_scrollbar_padding);
 
+  const StyleContentAlignmentData justify_content = ResolvedJustifyContent();
+  const AxisEdge main_axis_edge =
+      MainAxisStaticPositionEdge(justify_content, is_reverse_direction_);
+
   for (LayoutBox* oof_child : oofs) {
     BlockNode child(oof_child);
 
-    AxisEdge main_axis_edge = MainAxisStaticPositionEdge(Style());
     AxisEdge cross_axis_edge =
         CrossAxisStaticPositionEdge(Style(), child.Style());
 
@@ -449,8 +509,7 @@
   // Given CSS reading-flow, flex-flow, flex-direction; read values
   // in correct order.
   auto AddFlexItems = [&](const FlexLine& line) {
-    if (reading_flow == EReadingFlow::kFlexFlow &&
-        style.ResolvedIsReverseFlexDirection()) {
+    if (reading_flow == EReadingFlow::kFlexFlow && is_reverse_direction_) {
       for (const wtf_size_t item_index : base::Reversed(line.item_indices)) {
         AddItemIfNeeded(item_index);
       }
@@ -1328,7 +1387,7 @@
     flex_lines->Reverse();
   }
 
-  if (Style().ResolvedIsReverseFlexDirection()) {
+  if (is_reverse_direction_) {
     for (auto& flex_line : *flex_lines) {
       flex_line.item_indices.Reverse();
     }
@@ -1446,10 +1505,8 @@
   const auto& style = Style();
   const WritingDirectionMode writing_direction =
       GetConstraintSpace().GetWritingDirection();
-  const bool is_reverse_direction = style.ResolvedIsReverseFlexDirection();
 
-  const StyleContentAlignmentData justify_content =
-      FlexibleBoxAlgorithm::ResolvedJustifyContent(style);
+  const StyleContentAlignmentData justify_content = ResolvedJustifyContent();
   const StyleContentAlignmentData align_content = style.AlignContent();
 
   // Determine the cross-axis free-space.
@@ -1539,7 +1596,7 @@
                     : BorderScrollbarPadding().inline_start) +
         InitialContentPositionOffset(justify_content, safe_justify_position,
                                      main_axis_free_space, line_items_size,
-                                     is_reverse_direction);
+                                     is_reverse_direction_);
 
     for (wtf_size_t item_index : flex_line.item_indices) {
       const FlexItem& item = flex_items_[item_index];
diff --git a/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.h b/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.h
index 9eeb8744..e13d40ba 100644
--- a/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.h
@@ -89,6 +89,8 @@
       wtf_size_t flex_line_idx,
       LogicalOffset offset);
 
+  StyleContentAlignmentData ResolvedJustifyContent() const;
+
   // This is same method as FlexItem but we need that logic before FlexItem is
   // constructed.
   LayoutUnit MainAxisContentExtent(LayoutUnit sum_hypothetical_main_size) const;
@@ -191,6 +193,7 @@
   const bool is_webkit_box_;
   const bool is_column_;
   const bool is_wrap_reverse_;
+  const bool is_reverse_direction_;
   const bool is_multi_line_;
   const bool is_horizontal_flow_;
   const bool is_cross_size_definite_;
diff --git a/third_party/blink/renderer/core/layout/flex/flexible_box_algorithm.cc b/third_party/blink/renderer/core/layout/flex/flexible_box_algorithm.cc
index 207fde4f..c4b6912 100644
--- a/third_party/blink/renderer/core/layout/flex/flexible_box_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/flex/flexible_box_algorithm.cc
@@ -37,24 +37,6 @@
 #include "third_party/blink/renderer/platform/text/writing_mode.h"
 
 namespace blink {
-namespace {
-
-ItemPosition BoxAlignmentToItemPosition(EBoxAlignment alignment) {
-  switch (alignment) {
-    case EBoxAlignment::kBaseline:
-      return ItemPosition::kBaseline;
-    case EBoxAlignment::kCenter:
-      return ItemPosition::kCenter;
-    case EBoxAlignment::kStretch:
-      return ItemPosition::kStretch;
-    case EBoxAlignment::kStart:
-      return ItemPosition::kFlexStart;
-    case EBoxAlignment::kEnd:
-      return ItemPosition::kFlexEnd;
-  }
-}
-
-}  // namespace
 
 // static
 bool FlexibleBoxAlgorithm::IsHorizontalFlow(const ComputedStyle& style) {
@@ -64,76 +46,46 @@
 }
 
 // static
-StyleContentAlignmentData FlexibleBoxAlgorithm::ResolvedJustifyContent(
-    const ComputedStyle& style) {
-  if (style.IsDeprecatedWebkitBox()) {
-    const ContentPosition position = ([&]() {
-      // -webkit-box row-reverse currently flips the start/end (e.g. it always
-      // uses "start" rather than "flex-start"). Firefox doesn't have this
-      // quirk, we should attempt to remove it.
-      const bool is_row_reverse = style.ResolvedIsRowReverseFlexDirection();
-      switch (style.BoxPack()) {
-        case EBoxPack::kCenter:
-          return ContentPosition::kCenter;
-        case EBoxPack::kJustify:
-        case EBoxPack::kStart:
-          return is_row_reverse ? ContentPosition::kFlexEnd
-                                : ContentPosition::kFlexStart;
-        case EBoxPack::kEnd:
-          return is_row_reverse ? ContentPosition::kFlexStart
-                                : ContentPosition::kFlexEnd;
-      }
-    })();
-    const ContentDistributionType distribution =
-        style.BoxPack() == EBoxPack::kJustify
-            ? ContentDistributionType::kSpaceBetween
-            : ContentDistributionType::kDefault;
-    return StyleContentAlignmentData(position, distribution,
-                                     OverflowAlignment::kSafe);
-  }
-
-  const auto writing_direction = style.GetWritingDirection();
-  const StyleContentAlignmentData& justify_content = style.JustifyContent();
-
-  // Coerce "left"/"right" their logical variants.
-  ContentPosition position = justify_content.GetPosition();
-  if (position == ContentPosition::kLeft ||
-      position == ContentPosition::kRight) {
-    if (style.ResolvedIsColumnFlexDirection()) {
-      if (writing_direction.IsHorizontal()) {
-        // The main-axis is in the top-down direction, fallback to start.
-        position = ContentPosition::kStart;
-      } else {
-        LogicalToPhysical physical(
-            writing_direction, ContentPosition::kStart, ContentPosition::kEnd,
-            ContentPosition::kStart, ContentPosition::kEnd);
-        position = position == ContentPosition::kLeft ? physical.Left()
-                                                      : physical.Right();
-      }
-    } else {
-      position =
-          ((position == ContentPosition::kLeft) == writing_direction.IsLtr())
-              ? ContentPosition::kStart
-              : ContentPosition::kEnd;
-    }
-  }
-
-  return StyleContentAlignmentData(position, justify_content.Distribution(),
-                                   justify_content.Overflow());
-}
-
-// static
 ItemPosition FlexibleBoxAlgorithm::AlignmentForChild(
     const ComputedStyle& flexbox_style,
     const ComputedStyle& child_style) {
-  ItemPosition align =
-      flexbox_style.IsDeprecatedWebkitBox()
-          ? BoxAlignmentToItemPosition(flexbox_style.BoxAlign())
-          : child_style
-                .ResolvedAlignSelf(
-                    {ItemPosition::kStretch, OverflowAlignment::kDefault},
-                    &flexbox_style)
-                .GetPosition();
+  // Any auto-margins coerce the alignment to flex-start.
+  if (!child_style.HasOutOfFlowPosition()) {
+    if (IsHorizontalFlow(flexbox_style)) {
+      if (child_style.MarginTop().IsAuto() ||
+          child_style.MarginBottom().IsAuto()) {
+        return ItemPosition::kFlexStart;
+      }
+    } else {
+      if (child_style.MarginLeft().IsAuto() ||
+          child_style.MarginRight().IsAuto()) {
+        return ItemPosition::kFlexStart;
+      }
+    }
+  }
+
+  // -webkit-box has a relatively simple alignment mapping (no need to coerce
+  // "self-start", etc).
+  if (flexbox_style.IsDeprecatedWebkitBox()) {
+    switch (flexbox_style.BoxAlign()) {
+      case EBoxAlignment::kBaseline:
+        return ItemPosition::kBaseline;
+      case EBoxAlignment::kCenter:
+        return ItemPosition::kCenter;
+      case EBoxAlignment::kStretch:
+        return ItemPosition::kStretch;
+      case EBoxAlignment::kStart:
+        return ItemPosition::kFlexStart;
+      case EBoxAlignment::kEnd:
+        return ItemPosition::kFlexEnd;
+    }
+  }
+
+  ItemPosition align = child_style
+                           .ResolvedAlignSelf({ItemPosition::kStretch,
+                                               OverflowAlignment::kDefault},
+                                              &flexbox_style)
+                           .GetPosition();
   DCHECK_NE(align, ItemPosition::kAuto);
   DCHECK_NE(align, ItemPosition::kNormal);
   DCHECK_NE(align, ItemPosition::kLeft) << "left, right are only for justify";
@@ -166,20 +118,6 @@
     }
   }
 
-  if (!child_style.HasOutOfFlowPosition()) {
-    if (IsHorizontalFlow(flexbox_style)) {
-      if (child_style.MarginTop().IsAuto() ||
-          child_style.MarginBottom().IsAuto()) {
-        align = ItemPosition::kFlexStart;
-      }
-    } else {
-      if (child_style.MarginLeft().IsAuto() ||
-          child_style.MarginRight().IsAuto()) {
-        align = ItemPosition::kFlexStart;
-      }
-    }
-  }
-
   return align;
 }
 
diff --git a/third_party/blink/renderer/core/layout/flex/flexible_box_algorithm.h b/third_party/blink/renderer/core/layout/flex/flexible_box_algorithm.h
index 7618139a..2daf93d 100644
--- a/third_party/blink/renderer/core/layout/flex/flexible_box_algorithm.h
+++ b/third_party/blink/renderer/core/layout/flex/flexible_box_algorithm.h
@@ -51,7 +51,6 @@
  public:
   static bool IsHorizontalFlow(const ComputedStyle&);
 
-  static StyleContentAlignmentData ResolvedJustifyContent(const ComputedStyle&);
   static ItemPosition AlignmentForChild(const ComputedStyle& flexbox_style,
                                         const ComputedStyle& child_style);
 };
diff --git a/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc
index dd2b84a..322ecac 100644
--- a/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc
+++ b/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc
@@ -1732,31 +1732,31 @@
     }
   }
 
-  LogicalSize container_content_size = container_info.rect.size;
   PhysicalSize container_physical_content_size = ToPhysicalSize(
-      container_content_size, GetConstraintSpace().GetWritingMode());
+      container_info.rect.size, GetConstraintSpace().GetWritingMode());
   const WritingModeConverter container_converter(
-      container_info.writing_direction, container_physical_content_size);
+      container_info.writing_direction,
+      container_builder_->SizeForAnchorQueries());
+  PhysicalOffset offset_to_padding_box =
+      container_converter.ToPhysical(container_info.rect).offset;
   if (anchor_queries) {
     // When the containing block is block-fragmented, the |container_builder_|
     // is the fragmentainer, not the containing block, and the coordinate system
     // is stitched. Use the given |anchor_query|.
     const LayoutObject* css_containing_block = candidate_layout_box.Container();
     CHECK(css_containing_block);
-    return AnchorEvaluatorImpl(
-        candidate_layout_box, *anchor_queries, implicit_anchor,
-        *css_containing_block, container_converter,
-        container_converter.ToPhysical(container_info.rect).offset,
-        container_physical_content_size);
+    return AnchorEvaluatorImpl(candidate_layout_box, *anchor_queries,
+                               implicit_anchor, *css_containing_block,
+                               container_converter, offset_to_padding_box,
+                               container_physical_content_size);
   }
   if (const LogicalAnchorQuery* anchor_query =
           container_builder_->AnchorQuery()) {
     // Otherwise the |container_builder_| is the containing block.
-    return AnchorEvaluatorImpl(
-        candidate_layout_box, *anchor_query, implicit_anchor,
-        container_converter,
-        container_converter.ToPhysical(container_info.rect).offset,
-        container_physical_content_size);
+    return AnchorEvaluatorImpl(candidate_layout_box, *anchor_query,
+                               implicit_anchor, container_converter,
+                               offset_to_padding_box,
+                               container_physical_content_size);
   }
   return AnchorEvaluatorImpl();
 }
diff --git a/third_party/blink/renderer/core/layout/table/table_layout_utils.cc b/third_party/blink/renderer/core/layout/table/table_layout_utils.cc
index f831a56..ef1bbf17 100644
--- a/third_party/blink/renderer/core/layout/table/table_layout_utils.cc
+++ b/third_party/blink/renderer/core/layout/table/table_layout_utils.cc
@@ -69,21 +69,17 @@
 
   wtf_size_t effective_span =
       std::min(span, column_constraints->data.size() - start_column_index);
-  TableTypes::Column* start_column =
-      &column_constraints->data[start_column_index];
-  // TODO(crbug.com/351564777): Resolve a buffer safety issue.
-  TableTypes::Column* end_column = UNSAFE_TODO(start_column + effective_span);
-  // TODO(crbug.com/351564777): Resolve a buffer safety issue.
-  for (TableTypes::Column* column = start_column; column != end_column;
-       UNSAFE_TODO(++column)) {
-    if (!column->is_collapsed) {
-      column->is_mergeable = false;
+  auto column_span = base::span(column_constraints->data)
+                         .subspan(start_column_index, effective_span);
+  for (TableTypes::Column& column : column_span) {
+    if (!column.is_collapsed) {
+      column.is_mergeable = false;
       return;
     }
   }
   // We didn't find any non-collapsed column. Mark the first one as
   // non-mergeable.
-  start_column->is_mergeable = false;
+  column_span[0].is_mergeable = false;
 }
 
 // Applies cell/wide cell constraints to columns.
@@ -951,23 +947,15 @@
     LayoutUnit inline_border_spacing,
     TableTypes::Columns* column_constraints) {
   // Fixed layout does not merge columns.
-  DCHECK_LE(colspan_cell.span,
-            column_constraints->data.size() - colspan_cell.start_column);
-  TableTypes::Column* start_column =
-      &column_constraints->data[colspan_cell.start_column];
-  // TODO(crbug.com/351564777): Resolve a buffer safety issue.
-  TableTypes::Column* end_column =
-      UNSAFE_TODO(start_column + colspan_cell.span);
-  DCHECK_NE(start_column, end_column);
+  auto column_span = base::span(column_constraints->data)
+                         .subspan(colspan_cell.start_column, colspan_cell.span);
 
   // Inline sizes for redistribution exclude border spacing.
   LayoutUnit total_inner_border_spacing;
   unsigned effective_span = 0;
   bool is_first_column = true;
-  // TODO(crbug.com/351564777): Resolve a buffer safety issue.
-  for (TableTypes::Column* column = start_column; column != end_column;
-       UNSAFE_TODO(++column)) {
-    if (column->is_mergeable) {
+  for (TableTypes::Column& column : column_span) {
+    if (column.is_mergeable) {
       continue;
     }
     ++effective_span;
@@ -1005,29 +993,27 @@
   }
 
   TableTypes::Column* last_column = nullptr;
-  // TODO(crbug.com/351564777): Resolve a buffer safety issue.
-  for (TableTypes::Column* column = start_column; column < end_column;
-       UNSAFE_TODO(++column)) {
-    if (column->is_mergeable) {
+  for (TableTypes::Column& column : column_span) {
+    if (column.is_mergeable) {
       continue;
     }
-    last_column = column;
+    last_column = &column;
     rounding_error_min_inline_size -= new_min_size;
     rounding_error_max_inline_size -= new_max_size;
 
-    if (!column->min_inline_size) {
-      column->is_constrained |=
+    if (!column.min_inline_size) {
+      column.is_constrained |=
           colspan_cell.cell_inline_constraint.is_constrained;
-      column->min_inline_size = new_min_size;
+      column.min_inline_size = new_min_size;
     }
-    if (!column->max_inline_size) {
-      column->is_constrained |=
+    if (!column.max_inline_size) {
+      column.is_constrained |=
           colspan_cell.cell_inline_constraint.is_constrained;
-      column->max_inline_size = new_max_size;
+      column.max_inline_size = new_max_size;
     }
     // Percentages only get distributed over auto columns.
-    if (!column->percent && !column->is_constrained && new_percent) {
-      column->percent = *new_percent;
+    if (!column.percent && !column.is_constrained && new_percent) {
+      column.percent = *new_percent;
     }
   }
   DCHECK(last_column);
@@ -1051,14 +1037,14 @@
       &column_constraints->data[colspan_cell.start_column];
   // TODO(crbug.com/351564777): Resolve a buffer safety issue.
   TableTypes::Column* end_column = UNSAFE_TODO(start_column + effective_span);
+  auto column_span = base::span(column_constraints->data)
+                         .subspan(colspan_cell.start_column, effective_span);
 
   // Inline sizes for redistribution exclude border spacing.
   LayoutUnit total_inner_border_spacing;
   bool is_first_column = true;
-  // TODO(crbug.com/351564777): Resolve a buffer safety issue.
-  for (TableTypes::Column* column = start_column; column != end_column;
-       UNSAFE_TODO(++column)) {
-    if (!column->is_mergeable) {
+  for (TableTypes::Column& column : column_span) {
+    if (!column.is_mergeable) {
       if (!is_first_column) {
         total_inner_border_spacing += inline_border_spacing;
       } else {
@@ -1084,42 +1070,38 @@
     unsigned percent_columns_count = 0;
     unsigned nonpercent_columns_count = 0;
     LayoutUnit nonpercent_columns_max_inline_size;
-    // TODO(crbug.com/351564777): Resolve a buffer safety issue.
-    for (TableTypes::Column* column = start_column; column != end_column;
-         UNSAFE_TODO(++column)) {
-      if (!column->max_inline_size) {
-        column->max_inline_size = LayoutUnit();
+    for (TableTypes::Column& column : column_span) {
+      if (!column.max_inline_size) {
+        column.max_inline_size = LayoutUnit();
       }
-      if (!column->min_inline_size) {
-        column->min_inline_size = LayoutUnit();
+      if (!column.min_inline_size) {
+        column.min_inline_size = LayoutUnit();
       }
-      if (column->is_mergeable) {
+      if (column.is_mergeable) {
         continue;
       }
       all_columns_count++;
-      if (column->percent) {
+      if (column.percent) {
         percent_columns_count++;
-        columns_percent += *column->percent;
+        columns_percent += *column.percent;
       } else {
         nonpercent_columns_count++;
-        nonpercent_columns_max_inline_size += *column->max_inline_size;
+        nonpercent_columns_max_inline_size += *column.max_inline_size;
       }
     }
     float surplus_percent = *colspan_cell_percent - columns_percent;
     if (surplus_percent > 0.0f && all_columns_count > percent_columns_count) {
       // Distribute surplus percent to non-percent columns in proportion to
       // max_inline_size.
-      // TODO(crbug.com/351564777): Resolve a buffer safety issue.
-      for (TableTypes::Column* column = start_column; column != end_column;
-           UNSAFE_TODO(++column)) {
-        if (column->percent || column->is_mergeable) {
+      for (TableTypes::Column& column : column_span) {
+        if (column.percent || column.is_mergeable) {
           continue;
         }
         float column_percent;
         if (nonpercent_columns_max_inline_size != LayoutUnit()) {
           // Column percentage is proportional to its max_inline_size.
           column_percent = surplus_percent *
-                           column->max_inline_size.value_or(LayoutUnit()) /
+                           column.max_inline_size.value_or(LayoutUnit()) /
                            nonpercent_columns_max_inline_size;
         } else {
           // Distribute evenly instead.
@@ -1127,7 +1109,7 @@
           // 1px.
           column_percent = surplus_percent / nonpercent_columns_count;
         }
-        column->percent = column_percent;
+        column.percent = column_percent;
       }
     }
   }
@@ -1135,37 +1117,29 @@
   // TODO(atotic) See crbug.com/531752 for discussion about differences
   // between FF/Chrome.
   // Minimum inline size gets distributed with standard distribution algorithm.
-  // TODO(crbug.com/351564777): Resolve a buffer safety issue.
-  for (TableTypes::Column* column = start_column; column != end_column;
-       UNSAFE_TODO(++column)) {
-    if (!column->min_inline_size) {
-      column->min_inline_size = LayoutUnit();
+  for (TableTypes::Column& column : column_span) {
+    if (!column.min_inline_size) {
+      column.min_inline_size = LayoutUnit();
     }
-    if (!column->max_inline_size) {
-      column->max_inline_size = LayoutUnit();
+    if (!column.max_inline_size) {
+      column.max_inline_size = LayoutUnit();
     }
   }
   Vector<LayoutUnit> computed_sizes =
       DistributeInlineSizeToComputedInlineSizeAuto(
           colspan_cell_min_inline_size, start_column, end_column, true);
-  LayoutUnit* computed_size = computed_sizes.data();
-  // TODO(crbug.com/351564777): Resolve a buffer safety issue.
-  for (TableTypes::Column* column = start_column; column != end_column;
-       UNSAFE_TODO(++column, ++computed_size)) {
-    column->min_inline_size =
-        std::max(*column->min_inline_size, *computed_size);
+  for (wtf_size_t i = 0; TableTypes::Column & column : column_span) {
+    column.min_inline_size =
+        std::max(*column.min_inline_size, computed_sizes[i++]);
   }
   computed_sizes = DistributeInlineSizeToComputedInlineSizeAuto(
       colspan_cell_max_inline_size, start_column,
       end_column, /* treat_target_size_as_constrained */
       colspan_cell.cell_inline_constraint.is_constrained);
-  computed_size = computed_sizes.data();
-  // TODO(crbug.com/351564777): Resolve a buffer safety issue.
-  for (TableTypes::Column* column = start_column; column != end_column;
-       UNSAFE_TODO(++column, ++computed_size)) {
-    column->max_inline_size =
-        std::max(std::max(*column->min_inline_size, *column->max_inline_size),
-                 *computed_size);
+  for (wtf_size_t i = 0; TableTypes::Column & column : column_span) {
+    column.max_inline_size =
+        std::max(std::max(*column.min_inline_size, *column.max_inline_size),
+                 computed_sizes[i++]);
   }
 }
 
diff --git a/third_party/blink/renderer/modules/ai/ai.cc b/third_party/blink/renderer/modules/ai/ai.cc
index 9ea89a6..3271655 100644
--- a/third_party/blink/renderer/modules/ai/ai.cc
+++ b/third_party/blink/renderer/modules/ai/ai.cc
@@ -81,7 +81,8 @@
 AILanguageDetectorFactory* AI::languageDetector() {
   if (!ai_language_detector_factory_) {
     ai_language_detector_factory_ =
-        MakeGarbageCollected<AILanguageDetectorFactory>(GetExecutionContext());
+        MakeGarbageCollected<AILanguageDetectorFactory>(GetExecutionContext(),
+                                                        task_runner_);
   }
   return ai_language_detector_factory_.Get();
 }
diff --git a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector.idl b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector.idl
index 659ed44..ef5ba84 100644
--- a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector.idl
+++ b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector.idl
@@ -1,3 +1,8 @@
+dictionary LanguageDetectionResult {
+  DOMString? detectedLanguage; // null represents unknown language
+  double confidence;
+};
+
 [
     RuntimeEnabled=LanguageDetectionAPI,
     Exposed=(Window),
diff --git a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_capabilities.cc b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_capabilities.cc
index 1bc117b..e70b12d 100644
--- a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_capabilities.cc
+++ b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_capabilities.cc
@@ -5,6 +5,27 @@
 #include "third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_capabilities.h"
 
 namespace blink {
+namespace {
+using LanguageDetectionModelStatus =
+    LanguageDetectionModel::LanguageDetectionModelStatus;
+V8AICapabilityAvailability MapToV8Capability(
+    LanguageDetectionModelStatus model_status) {
+  switch (model_status) {
+    case LanguageDetectionModelStatus::kReadily:
+      return V8AICapabilityAvailability(
+          V8AICapabilityAvailability::Enum::kReadily);
+    case LanguageDetectionModelStatus::kAfterDownload:
+      return V8AICapabilityAvailability(
+          V8AICapabilityAvailability::Enum::kAfterDownload);
+    case LanguageDetectionModelStatus::kNotAvailable:
+      return V8AICapabilityAvailability(V8AICapabilityAvailability::Enum::kNo);
+  }
+}
+}  // namespace
+
+AILanguageDetectorCapabilities::AILanguageDetectorCapabilities(
+    LanguageDetectionModelStatus model_status)
+    : model_status_(model_status) {}
 
 V8AICapabilityAvailability AILanguageDetectorCapabilities::available(
     ScriptState* script_state,
@@ -14,15 +35,14 @@
                                       "The execution context is not valid.");
     return V8AICapabilityAvailability(V8AICapabilityAvailability::Enum::kNo);
   }
-
-  // TODO(crbug.com/349927087): Implement actual check for availability.
-  return V8AICapabilityAvailability(V8AICapabilityAvailability::Enum::kReadily);
+  return MapToV8Capability(model_status_);
 }
 
 V8AICapabilityAvailability AILanguageDetectorCapabilities::languageAvailable(
     const WTF::String& languageTag) {
-  // TODO(crbug.com/349927087): Implement actual check for availability.
-  return V8AICapabilityAvailability(V8AICapabilityAvailability::Enum::kReadily);
+  // TODO(crbug.com/349927087): Implement actual check for availability of each
+  // language.
+  return MapToV8Capability(model_status_);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_capabilities.h b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_capabilities.h
index 878c68d..e6720bc 100644
--- a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_capabilities.h
+++ b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_capabilities.h
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/language_detection/language_detection_model.h"
 
 namespace blink {
 
@@ -17,12 +18,18 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  explicit AILanguageDetectorCapabilities() = default;
+  using LanguageDetectionModelStatus =
+      LanguageDetectionModel::LanguageDetectionModelStatus;
+  explicit AILanguageDetectorCapabilities(
+      LanguageDetectionModelStatus model_status);
   ~AILanguageDetectorCapabilities() override = default;
 
   V8AICapabilityAvailability available(ScriptState* script_state,
                                        ExceptionState& exception_state) const;
   V8AICapabilityAvailability languageAvailable(const WTF::String& languageTag);
+
+ private:
+  LanguageDetectionModelStatus model_status_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.cc b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.cc
index ebec155..8e68251 100644
--- a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.cc
+++ b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.cc
@@ -4,33 +4,110 @@
 
 #include "third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.h"
 
+#include "third_party/blink/renderer/bindings/modules/v8/v8_ai_create_monitor_callback.h"
 #include "third_party/blink/renderer/modules/ai/ai.h"
+#include "third_party/blink/renderer/modules/ai/ai_create_monitor.h"
 #include "third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector.h"
 
 namespace blink {
-AILanguageDetectorFactory::AILanguageDetectorFactory(ExecutionContext* context)
-    : ExecutionContextClient(context) {}
+
+namespace {
+
+class RejectOnDestructionHelper {
+ public:
+  explicit RejectOnDestructionHelper(
+      ScriptPromiseResolver<AILanguageDetectorCapabilities>* resolver)
+      : resolver_(resolver) {
+    CHECK(resolver);
+  }
+
+  RejectOnDestructionHelper(const RejectOnDestructionHelper&) = delete;
+  RejectOnDestructionHelper& operator=(const RejectOnDestructionHelper&) =
+      delete;
+
+  RejectOnDestructionHelper(RejectOnDestructionHelper&& other) = default;
+  RejectOnDestructionHelper& operator=(RejectOnDestructionHelper&& other) =
+      default;
+
+  Persistent<ScriptPromiseResolver<AILanguageDetectorCapabilities>> Take() {
+    return std::move(resolver_);
+  }
+
+  ~RejectOnDestructionHelper() {
+    if (resolver_) {
+      resolver_->Reject();
+    }
+  }
+
+ private:
+  Persistent<ScriptPromiseResolver<AILanguageDetectorCapabilities>> resolver_;
+};
+
+}  // namespace
+
+AILanguageDetectorFactory::AILanguageDetectorCreateTask::
+    AILanguageDetectorCreateTask(
+        ScriptPromiseResolver<AILanguageDetector>* resolver,
+        ExecutionContext* execution_context,
+        scoped_refptr<base::SequencedTaskRunner> task_runner,
+        const AILanguageDetectorCreateOptions* options)
+    : ExecutionContextClient(execution_context), resolver_(resolver) {
+  if (options->hasMonitor()) {
+    monitor_ =
+        MakeGarbageCollected<AICreateMonitor>(execution_context, task_runner);
+    std::ignore = options->monitor()->Invoke(nullptr, monitor_);
+  }
+}
+
+void AILanguageDetectorFactory::AILanguageDetectorCreateTask::Trace(
+    Visitor* visitor) const {
+  ExecutionContextClient::Trace(visitor);
+  visitor->Trace(resolver_);
+  visitor->Trace(monitor_);
+}
+
+void AILanguageDetectorFactory::AILanguageDetectorCreateTask::CreateDetector(
+    base::OnceClosure on_created_callback) {
+  LanguageDetectionModel::Create(
+      GetExecutionContext()->GetBrowserInterfaceBroker(),
+      WTF::BindOnce(&AILanguageDetectorFactory::AILanguageDetectorCreateTask::
+                        OnModelLoaded,
+                    WrapPersistent(this), std::move(on_created_callback)));
+}
+
+AILanguageDetectorFactory::AILanguageDetectorFactory(
+    ExecutionContext* context,
+    scoped_refptr<base::SequencedTaskRunner> task_runner)
+    : ExecutionContextClient(context), task_runner_(task_runner) {}
 
 void AILanguageDetectorFactory::Trace(Visitor* visitor) const {
   ScriptWrappable::Trace(visitor);
   ExecutionContextClient::Trace(visitor);
+  visitor->Trace(pending_tasks_);
 }
 
-namespace {
-void HandleCreateDetectorCallback(
-    ScriptPromiseResolver<blink::AILanguageDetector>* resolver,
+void AILanguageDetectorFactory::AILanguageDetectorCreateTask::OnModelLoaded(
+    base::OnceClosure on_created_callback,
     base::expected<LanguageDetectionModel*, DetectLanguageError> maybe_model) {
   if (maybe_model.has_value()) {
-    resolver->Resolve(
-        MakeGarbageCollected<AILanguageDetector>(maybe_model.value()));
+    LanguageDetectionModel* model = maybe_model.value();
+    // TODO (crbug.com/383022111): Pass the real download progress rather than
+    // mocking one.
+    if (monitor_) {
+      monitor_->OnDownloadProgressUpdate(0, model->GetModelSize());
+      monitor_->OnDownloadProgressUpdate(model->GetModelSize(),
+                                         model->GetModelSize());
+    }
+    resolver_->Resolve(MakeGarbageCollected<AILanguageDetector>(model));
   } else {
     switch (maybe_model.error()) {
       case DetectLanguageError::kUnavailable:
-        resolver->Reject("Model not available");
+        resolver_->Reject("Model not available");
     }
   }
+
+  std::move(on_created_callback).Run();
 }
-}  // namespace
 
 ScriptPromise<AILanguageDetector> AILanguageDetectorFactory::create(
     ScriptState* script_state,
@@ -46,10 +123,16 @@
   auto* resolver =
       MakeGarbageCollected<ScriptPromiseResolver<AILanguageDetector>>(
           script_state);
-  LanguageDetectionModel::Create(
-      GetExecutionContext()->GetBrowserInterfaceBroker(),
-      WTF::BindOnce(&HandleCreateDetectorCallback, WrapPersistent(resolver)));
-
+  AILanguageDetectorCreateTask* create_task =
+      MakeGarbageCollected<AILanguageDetectorCreateTask>(
+          resolver, GetExecutionContext(), task_runner_, options);
+  pending_tasks_.insert(create_task);
+  create_task->CreateDetector(WTF::BindOnce(
+      [](AILanguageDetectorFactory* factory,
+         AILanguageDetectorCreateTask* task) {
+        factory->pending_tasks_.erase(task);
+      },
+      WrapWeakPersistent(this), WrapPersistent(create_task)));
   return resolver->Promise();
 }
 
@@ -57,13 +140,20 @@
 AILanguageDetectorFactory::capabilities(ScriptState* script_state) {
   auto* resolver = MakeGarbageCollected<
       ScriptPromiseResolver<AILanguageDetectorCapabilities>>(script_state);
-
-  // Create an AILanguageDetectorCapabilities object
-  auto* capabilities = MakeGarbageCollected<AILanguageDetectorCapabilities>();
-
-  // Resolve the promise with the capabilities object
-  resolver->Resolve(capabilities);
+  // The call may silently fail on mojo connection errors. The
+  // RejectOnDestructionHelper class is created to reject the promise if
+  // such error happens.
+  LanguageDetectionModel::GetStatus(
+      GetExecutionContext()->GetBrowserInterfaceBroker(),
+      WTF::BindOnce(
+          [](RejectOnDestructionHelper resolver,
+             LanguageDetectionModel::LanguageDetectionModelStatus status) {
+            resolver.Take()->Resolve(
+                MakeGarbageCollected<AILanguageDetectorCapabilities>(status));
+          },
+          RejectOnDestructionHelper(resolver)));
 
   return resolver->Promise();
 }
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.h b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.h
index 6dc052cf..e61908a0 100644
--- a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.h
+++ b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.h
@@ -10,15 +10,21 @@
 #include "third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector.h"
 #include "third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_capabilities.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h"
 
 namespace blink {
+
+class AICreateMonitor;
+
 // `ExecutionContextClient` gives us access to the browser interface broker.
 class AILanguageDetectorFactory final : public ScriptWrappable,
-                                        ExecutionContextClient {
+                                        public ExecutionContextClient {
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  explicit AILanguageDetectorFactory(ExecutionContext* context);
+  explicit AILanguageDetectorFactory(
+      ExecutionContext* context,
+      scoped_refptr<base::SequencedTaskRunner> task_runner);
 
   void Trace(Visitor* visitor) const override;
 
@@ -30,6 +36,33 @@
 
   ScriptPromise<AILanguageDetectorCapabilities> capabilities(
       ScriptState* script_state);
+
+ private:
+  class AILanguageDetectorCreateTask
+      : public GarbageCollected<AILanguageDetectorCreateTask>,
+        public ExecutionContextClient {
+   public:
+    AILanguageDetectorCreateTask(
+        ScriptPromiseResolver<AILanguageDetector>* resolver,
+        ExecutionContext* execution_context,
+        scoped_refptr<base::SequencedTaskRunner> task_runner,
+        const AILanguageDetectorCreateOptions* options);
+
+    void CreateDetector(base::OnceClosure on_created_callback);
+
+    void Trace(Visitor* visitor) const override;
+
+   private:
+    void OnModelLoaded(base::OnceClosure on_created_callback,
+                       base::expected<LanguageDetectionModel*,
+                                      DetectLanguageError> maybe_model);
+
+    Member<AICreateMonitor> monitor_;
+    Member<ScriptPromiseResolver<AILanguageDetector>> resolver_;
+  };
+
+  HeapHashSet<Member<AILanguageDetectorCreateTask>> pending_tasks_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.idl b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.idl
index f8af0047d..b2d0970 100644
--- a/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.idl
+++ b/third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector_factory.idl
@@ -17,5 +17,5 @@
 
 dictionary AILanguageDetectorCreateOptions {
   AbortSignal signal;
-  // TODO(crbug.com/349927087): Add AICreateMonitorCallback.
+  AICreateMonitorCallback monitor;
 };
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h
index 7139b0b..ea082e7 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h
@@ -192,13 +192,13 @@
                 CanvasPerformanceMonitor::DrawType) final;
 
   SkColorInfo CanvasRenderingContextSkColorInfo() const override {
-    return color_params_.GetSkColorInfo();
+    return SkColorInfo(GetSkColorType(), GetAlphaType(), GetSkColorSpace());
   }
   SkAlphaType GetAlphaType() const override {
     return color_params_.GetAlphaType();
   }
   SkColorType GetSkColorType() const override {
-    return CanvasRenderingContextSkColorInfo().colorType();
+    return color_params_.GetSkColorType();
   }
   sk_sp<SkColorSpace> GetSkColorSpace() const override {
     return color_params_.GetSkColorSpace();
diff --git a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context_base.h b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context_base.h
index 9115b3a..95f1066 100644
--- a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context_base.h
+++ b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context_base.h
@@ -43,8 +43,7 @@
   void SetUV(const gfx::PointF& left_top, const gfx::PointF& right_bottom);
 
   SkColorInfo CanvasRenderingContextSkColorInfo() const final {
-    return SkColorInfo(kN32_SkColorType, kPremul_SkAlphaType,
-                       SkColorSpace::MakeSRGB());
+    return SkColorInfo(GetSkColorType(), GetAlphaType(), GetSkColorSpace());
   }
   SkAlphaType GetAlphaType() const override { return kPremul_SkAlphaType; }
   SkColorType GetSkColorType() const override { return kN32_SkColorType; }
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h
index 2ac3be9..74527ae 100644
--- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h
+++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h
@@ -62,13 +62,13 @@
     BaseRenderingContext2D::clearRect(x, y, width, height);
   }
   SkColorInfo CanvasRenderingContextSkColorInfo() const override {
-    return color_params_.GetSkColorInfo();
+    return SkColorInfo(GetSkColorType(), GetAlphaType(), GetSkColorSpace());
   }
   SkAlphaType GetAlphaType() const override {
     return color_params_.GetAlphaType();
   }
   SkColorType GetSkColorType() const override {
-    return CanvasRenderingContextSkColorInfo().colorType();
+    return color_params_.GetSkColorType();
   }
   sk_sp<SkColorSpace> GetSkColorSpace() const override {
     return color_params_.GetSkColorSpace();
diff --git a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
index b09f1d52..538505de 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
@@ -2070,12 +2070,7 @@
     UseCounter::Count(resolver->GetExecutionContext(),
                       WebFeature::kFedCmIframe);
   }
-  // Track when websites use FedCM with the IDP sign-in status opt-in
-  if (RuntimeEnabledFeatures::FedCmIdpSigninStatusEnabled(
-          resolver->GetExecutionContext())) {
-    UseCounter::Count(resolver->GetExecutionContext(),
-                      WebFeature::kFedCmIdpSigninStatusApi);
-  }
+
   int provider_index = 0;
   Vector<mojom::blink::IdentityProviderRequestOptionsPtr>
       identity_provider_ptrs;
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl
index c7e9d1f..cfe9fc1 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl
+++ b/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl
@@ -27,7 +27,7 @@
     [CallWith=ScriptState, RaisesException, MeasureAs=FedCmUserInfo]
     static Promise<sequence<IdentityUserInfo>> getUserInfo(IdentityProviderConfig config);
 
-    [RuntimeEnabled=FedCmIdpSigninStatus, CallWith=ScriptState]
+    [CallWith=ScriptState]
     static void close();
 
     [RuntimeEnabled=FedCmIdPRegistration, CallWith=ScriptState, ImplementedAs=registerIdentityProvider]
diff --git a/third_party/blink/renderer/modules/credentialmanagement/navigator_login.idl b/third_party/blink/renderer/modules/credentialmanagement/navigator_login.idl
index 6303dc2..b158a35 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/navigator_login.idl
+++ b/third_party/blink/renderer/modules/credentialmanagement/navigator_login.idl
@@ -14,13 +14,13 @@
     ImplementedAs=NavigatorLogin
 ]
 partial interface Navigator {
-  [SecureContext, RuntimeEnabled=FedCmIdpSigninStatus] readonly attribute NavigatorLogin login;
+  [SecureContext, RuntimeEnabled=FedCm] readonly attribute NavigatorLogin login;
 };
 
 [
     Exposed=Window,
     SecureContext,
-    RuntimeEnabled=FedCmIdpSigninStatus
+    RuntimeEnabled=FedCm
 ]
 interface NavigatorLogin {
     [CallWith=ScriptState, MeasureAs=FedCmIdpSigninStatusJsApi]
diff --git a/third_party/blink/renderer/modules/on_device_translation/BUILD.gn b/third_party/blink/renderer/modules/on_device_translation/BUILD.gn
index 21470f0..21772fc 100644
--- a/third_party/blink/renderer/modules/on_device_translation/BUILD.gn
+++ b/third_party/blink/renderer/modules/on_device_translation/BUILD.gn
@@ -8,8 +8,6 @@
   sources = [
     "dom_translation.cc",
     "dom_translation.h",
-    "language_detector.cc",
-    "language_detector.h",
     "language_translator.cc",
     "language_translator.h",
     "translation.cc",
diff --git a/third_party/blink/renderer/modules/on_device_translation/language_detector.cc b/third_party/blink/renderer/modules/on_device_translation/language_detector.cc
deleted file mode 100644
index 1a90e308..0000000
--- a/third_party/blink/renderer/modules/on_device_translation/language_detector.cc
+++ /dev/null
@@ -1,52 +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.
-
-#include "third_party/blink/renderer/modules/on_device_translation/language_detector.h"
-
-#include "base/memory/scoped_refptr.h"
-#include "third_party/blink/renderer/bindings/core/v8/idl_types.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_language_detection_result.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_language_detector.h"
-#include "third_party/blink/renderer/core/dom/dom_exception.h"
-#include "third_party/blink/renderer/modules/ai/on_device_translation/ai_language_detector.h"
-#include "third_party/blink/renderer/platform/bindings/exception_code.h"
-#include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
-#include "third_party/blink/renderer/platform/language_detection/language_detection_model.h"
-
-namespace blink {
-
-LanguageDetector::LanguageDetector(
-    LanguageDetectionModel* language_detection_model)
-    : language_detection_model_(language_detection_model) {}
-
-void LanguageDetector::Trace(Visitor* visitor) const {
-  visitor->Trace(language_detection_model_);
-  ScriptWrappable::Trace(visitor);
-}
-
-// TODO(crbug.com/349927087): The new version is AILanguageDetector::detect().
-// Delete this old version.
-ScriptPromise<IDLSequence<LanguageDetectionResult>> LanguageDetector::detect(
-    ScriptState* script_state,
-    const WTF::String& input,
-    ExceptionState& exception_state) {
-  if (!script_state->ContextIsValid()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
-                                      "The execution context is not valid.");
-    return ScriptPromise<IDLSequence<LanguageDetectionResult>>();
-  }
-
-  auto* resolver = MakeGarbageCollected<
-      ScriptPromiseResolver<IDLSequence<LanguageDetectionResult>>>(
-      script_state);
-
-  language_detection_model_->DetectLanguage(
-      input, WTF::BindOnce(AILanguageDetector::OnDetectComplete,
-                           WrapPersistent(resolver)));
-  return resolver->Promise();
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/modules/on_device_translation/language_detector.h b/third_party/blink/renderer/modules/on_device_translation/language_detector.h
deleted file mode 100644
index 86064fc..0000000
--- a/third_party/blink/renderer/modules/on_device_translation/language_detector.h
+++ /dev/null
@@ -1,41 +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.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_LANGUAGE_DETECTOR_H_
-#define THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_LANGUAGE_DETECTOR_H_
-
-#include "base/memory/scoped_refptr.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_language_detection_result.h"
-#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
-#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
-#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
-
-namespace blink {
-
-class LanguageDetectionModel;
-
-// The class that represents a Detector with source and target language.
-class LanguageDetector final : public ScriptWrappable {
-  DEFINE_WRAPPERTYPEINFO();
-
- public:
-  explicit LanguageDetector(LanguageDetectionModel* language_detection_model);
-  ~LanguageDetector() override = default;
-
-  void Trace(Visitor* visitor) const override;
-
-  // language_detector.idl implementation.
-  ScriptPromise<IDLSequence<LanguageDetectionResult>> detect(
-      ScriptState* script_state,
-      const WTF::String& input,
-      ExceptionState& exception_state);
-
- private:
-  Member<LanguageDetectionModel> language_detection_model_;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_ON_DEVICE_TRANSLATION_LANGUAGE_DETECTOR_H_
diff --git a/third_party/blink/renderer/modules/on_device_translation/language_detector.idl b/third_party/blink/renderer/modules/on_device_translation/language_detector.idl
deleted file mode 100644
index c4e9a46..0000000
--- a/third_party/blink/renderer/modules/on_device_translation/language_detector.idl
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2024 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Explainer: https://github.com/WICG/translation-api/blob/5151a1b1b37cd604542715141b0a203a8c6e9061/README.md
-// TODO(https://crbug.com/349927087): Migrate to latest API when it is decided.
-dictionary LanguageDetectionResult {
-  DOMString? detectedLanguage;
-  double confidence;
-};
-
-[
-  RuntimeEnabled=LanguageDetectionAPI,
-  Exposed=Window
-]
-interface LanguageDetector {
-  [
-    Measure,
-    CallWith=ScriptState,
-    RaisesException
-  ]
-  Promise<sequence<LanguageDetectionResult>> detect(DOMString input);
-};
diff --git a/third_party/blink/renderer/modules/on_device_translation/translation.cc b/third_party/blink/renderer/modules/on_device_translation/translation.cc
index fd4678d..b9bf0bc 100644
--- a/third_party/blink/renderer/modules/on_device_translation/translation.cc
+++ b/third_party/blink/renderer/modules/on_device_translation/translation.cc
@@ -15,7 +15,6 @@
 #include "third_party/blink/renderer/bindings/modules/v8/v8_translation_language_options.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/modules/ai/ai_mojo_client.h"
-#include "third_party/blink/renderer/modules/on_device_translation/language_detector.h"
 #include "third_party/blink/renderer/modules/on_device_translation/language_translator.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
@@ -259,62 +258,4 @@
   return promise;
 }
 
-// TODO(crbug.com/349927087): The new version is
-// AILanguageDetectorCapabilities::languageAvailable(). Delete this old version.
-ScriptPromise<V8TranslationAvailability> Translation::canDetect(
-    ScriptState* script_state,
-    ExceptionState& exception_state) {
-  if (!script_state->ContextIsValid()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
-                                      "The execution context is not valid.");
-    return ScriptPromise<V8TranslationAvailability>();
-  }
-
-  auto* resolver =
-      MakeGarbageCollected<ScriptPromiseResolver<V8TranslationAvailability>>(
-          script_state);
-  auto promise = resolver->Promise();
-
-  resolver->Resolve(
-      V8TranslationAvailability(V8TranslationAvailability::Enum::kReadily));
-
-  return promise;
-}
-
-namespace {
-void HandleCreateDetectorCallback(
-    ScriptPromiseResolver<blink::LanguageDetector>* resolver,
-    base::expected<LanguageDetectionModel*, DetectLanguageError> maybe_model) {
-  if (maybe_model.has_value()) {
-    resolver->Resolve(
-        MakeGarbageCollected<LanguageDetector>(maybe_model.value()));
-  } else {
-    switch (maybe_model.error()) {
-      case DetectLanguageError::kUnavailable:
-        resolver->Reject("Model not available");
-    }
-  }
-}
-}  // namespace
-
-// TODO(crbug.com/349927087): The new version is
-// AILanguageDetectorFactory::create(). Delete this old version.
-ScriptPromise<LanguageDetector> Translation::createDetector(
-    ScriptState* script_state,
-    ExceptionState& exception_state) {
-  if (!script_state->ContextIsValid()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
-                                      "The execution context is not valid.");
-    return ScriptPromise<LanguageDetector>();
-  }
-
-  auto* resolver =
-      MakeGarbageCollected<ScriptPromiseResolver<LanguageDetector>>(
-          script_state);
-  LanguageDetectionModel::Create(
-      GetExecutionContext()->GetBrowserInterfaceBroker(),
-      WTF::BindOnce(&HandleCreateDetectorCallback, WrapPersistent(resolver)));
-
-  return resolver->Promise();
-}
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/on_device_translation/translation.h b/third_party/blink/renderer/modules/on_device_translation/translation.h
index 0a0f54b..e19db84 100644
--- a/third_party/blink/renderer/modules/on_device_translation/translation.h
+++ b/third_party/blink/renderer/modules/on_device_translation/translation.h
@@ -18,7 +18,6 @@
 #include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
 
 namespace blink {
-class LanguageDetector;
 class LanguageTranslator;
 class V8TranslationAvailability;
 
@@ -43,12 +42,6 @@
       ScriptState* script_state,
       TranslationLanguageOptions* options,
       ExceptionState& exception_state);
-  ScriptPromise<V8TranslationAvailability> canDetect(
-      ScriptState* script_state,
-      ExceptionState& exception_state);
-  ScriptPromise<LanguageDetector> createDetector(
-      ScriptState* script_state,
-      ExceptionState& exception_state);
 
  private:
   HeapMojoRemote<mojom::blink::TranslationManager>&
diff --git a/third_party/blink/renderer/modules/on_device_translation/translation.idl b/third_party/blink/renderer/modules/on_device_translation/translation.idl
index a27472ec..b9c74c4 100644
--- a/third_party/blink/renderer/modules/on_device_translation/translation.idl
+++ b/third_party/blink/renderer/modules/on_device_translation/translation.idl
@@ -31,20 +31,4 @@
   Promise<LanguageTranslator> createTranslator(
     TranslationLanguageOptions options
   );
-  [
-    RuntimeEnabled=LanguageDetectionAPI,
-    Exposed=Window,
-    Measure,
-    CallWith=ScriptState,
-    RaisesException
-  ]
-  Promise<TranslationAvailability> canDetect();
-  [
-    RuntimeEnabled=LanguageDetectionAPI,
-    Exposed=Window,
-    Measure,
-    CallWith=ScriptState,
-    RaisesException
-  ]
-  Promise<LanguageDetector> createDetector();
 };
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index c4caa949..aa509d36 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1765,6 +1765,7 @@
     "//cc/ipc",
     "//cc/mojo_embedder",
     "//components/language_detection/content/common",
+    "//components/language_detection/content/common:common_blink",
     "//components/language_detection/content/renderer",
     "//components/language_detection/core",
     "//components/paint_preview/common",
diff --git a/third_party/blink/renderer/platform/bindings/exception_state.cc b/third_party/blink/renderer/platform/bindings/exception_state.cc
index b6f9918..567b26f 100644
--- a/third_party/blink/renderer/platform/bindings/exception_state.cc
+++ b/third_party/blink/renderer/platform/bindings/exception_state.cc
@@ -97,7 +97,7 @@
   // must be given to the data exposed to JavaScript via |sanitized_message|.
   DCHECK_NE(exception_code, DOMExceptionCode::kSecurityError);
 #if DCHECK_IS_ON()
-  DCHECK_AT(!assert_no_exceptions_, file_, line_)
+  DCHECK_AT(!assert_no_exceptions_, location_)
       << "DOMException should not be thrown.";
 #endif
 
@@ -112,7 +112,7 @@
 void ExceptionState::ThrowSecurityError(const String& sanitized_message,
                                         const String& unsanitized_message) {
 #if DCHECK_IS_ON()
-  DCHECK_AT(!assert_no_exceptions_, file_, line_)
+  DCHECK_AT(!assert_no_exceptions_, location_)
       << "SecurityError should not be thrown.";
 #endif
   SetExceptionInfo(ToExceptionCode(DOMExceptionCode::kSecurityError),
@@ -127,7 +127,7 @@
 
 void ExceptionState::ThrowRangeError(const String& message) {
 #if DCHECK_IS_ON()
-  DCHECK_AT(!assert_no_exceptions_, file_, line_)
+  DCHECK_AT(!assert_no_exceptions_, location_)
       << "RangeError should not be thrown.";
 #endif
   SetExceptionInfo(ToExceptionCode(ESErrorType::kRangeError), message);
@@ -138,7 +138,7 @@
 
 void ExceptionState::ThrowTypeError(const String& message) {
 #if DCHECK_IS_ON()
-  DCHECK_AT(!assert_no_exceptions_, file_, line_)
+  DCHECK_AT(!assert_no_exceptions_, location_)
       << "TypeError should not be thrown.";
 #endif
   SetExceptionInfo(ToExceptionCode(ESErrorType::kTypeError), message);
@@ -149,7 +149,7 @@
 
 void ExceptionState::ThrowWasmCompileError(const String& message) {
 #if DCHECK_IS_ON()
-  DCHECK_AT(!assert_no_exceptions_, file_, line_)
+  DCHECK_AT(!assert_no_exceptions_, location_)
       << "WebAssembly.CompileError should not be thrown.";
 #endif
   SetExceptionInfo(ToExceptionCode(ESErrorType::kWasmCompileError), message);
@@ -160,7 +160,7 @@
 
 void ExceptionState::RethrowV8Exception(v8::TryCatch& try_catch) {
 #if DCHECK_IS_ON()
-  DCHECK_AT(!assert_no_exceptions_, file_, line_)
+  DCHECK_AT(!assert_no_exceptions_, location_)
       << "A V8 exception should not be thrown.";
 #endif
   SetExceptionInfo(
diff --git a/third_party/blink/renderer/platform/bindings/exception_state.h b/third_party/blink/renderer/platform/bindings/exception_state.h
index a52fe57..fa370e7 100644
--- a/third_party/blink/renderer/platform/bindings/exception_state.h
+++ b/third_party/blink/renderer/platform/bindings/exception_state.h
@@ -34,6 +34,7 @@
 #include "base/check.h"
 #include "base/compiler_specific.h"
 #include "base/dcheck_is_on.h"
+#include "base/location.h"
 #include "third_party/blink/renderer/platform/bindings/exception_code.h"
 #include "third_party/blink/renderer/platform/bindings/exception_context.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
@@ -114,13 +115,19 @@
  protected:
   // Delegated constructor for NonThrowableExceptionState
   enum ForNonthrowable { kNonthrowable };
-  ExceptionState(const char* file, int line, ForNonthrowable)
-      : context_(kEmptyContext), isolate_(nullptr) {
 #if DCHECK_IS_ON()
-    file_ = file;
-    line_ = line;
-    assert_no_exceptions_ = true;
+  ExceptionState(const base::Location& location, ForNonthrowable)
+#else
+  explicit ExceptionState(ForNonthrowable)
 #endif
+      : context_(kEmptyContext),
+        isolate_(nullptr)
+#if DCHECK_IS_ON()
+        ,
+        location_(location),
+        assert_no_exceptions_(true)
+#endif
+  {
   }
 
   // Delegated constructor for DummyExceptionStateForTesting
@@ -146,8 +153,7 @@
   bool swallow_all_exceptions_ = false;
 
 #if DCHECK_IS_ON()
-  const char* file_ = "";
-  int line_ = 0;
+  base::Location location_;
   bool assert_no_exceptions_ = false;
 #endif
 };
@@ -173,8 +179,13 @@
 // Should be used if an exception must not be thrown.
 class PLATFORM_EXPORT NonThrowableExceptionState final : public ExceptionState {
  public:
-  NonThrowableExceptionState(const char* file = "", int line = 0)
-      : ExceptionState(file, line, kNonthrowable) {}
+#if DCHECK_IS_ON()
+  explicit NonThrowableExceptionState(
+      base::Location location = base::Location::Current())
+      : ExceptionState(location, kNonthrowable) {}
+#else
+  NonThrowableExceptionState() : ExceptionState(kNonthrowable) {}
+#endif
 };
 
 // DummyExceptionStateForTesting ignores all thrown exceptions. Syntactic sugar
@@ -229,8 +240,7 @@
 //
 //     Node* removeChild(Node*, ExceptionState& = ASSERT_NO_EXCEPTION);
 #if DCHECK_IS_ON()
-#define ASSERT_NO_EXCEPTION \
-  (::blink::NonThrowableExceptionState(__FILE__, __LINE__).ReturnThis())
+#define ASSERT_NO_EXCEPTION (::blink::NonThrowableExceptionState().ReturnThis())
 #else
 #define ASSERT_NO_EXCEPTION IGNORE_EXCEPTION
 #endif
diff --git a/third_party/blink/renderer/platform/language_detection/DEPS b/third_party/blink/renderer/platform/language_detection/DEPS
index 550ffb5..8ad87c6 100644
--- a/third_party/blink/renderer/platform/language_detection/DEPS
+++ b/third_party/blink/renderer/platform/language_detection/DEPS
@@ -7,6 +7,7 @@
 
     # Dependencies.
     "+components/language_detection/core",
+    "+components/language_detection/content/common",
     "+components/language_detection/content/renderer",
     "+third_party/blink/renderer/platform/heap",
     "+third_party/blink/renderer/platform/platform_export.h",
diff --git a/third_party/blink/renderer/platform/language_detection/language_detection_model.cc b/third_party/blink/renderer/platform/language_detection/language_detection_model.cc
index 2ba01a6..56fe314 100644
--- a/third_party/blink/renderer/platform/language_detection/language_detection_model.cc
+++ b/third_party/blink/renderer/platform/language_detection/language_detection_model.cc
@@ -12,6 +12,7 @@
 #include "base/functional/callback.h"
 #include "base/no_destructor.h"
 #include "base/types/expected.h"
+#include "components/language_detection/content/common/language_detection.mojom-blink.h"
 #include "components/language_detection/content/renderer/language_detection_model_manager.h"
 #include "components/language_detection/core/language_detection_model.h"
 #include "mojo/public/cpp/bindings/remote.h"
@@ -50,6 +51,14 @@
       WTF::BindOnce(OnModelResponseReceived, std::move(callback)));
 }
 
+// static
+void LanguageDetectionModel::GetStatus(
+    const blink::BrowserInterfaceBrokerProxy& interface_broker,
+    LanguageDetectionModelStatusCallback callback) {
+  GetLanguageDetectionModelManager().GetLanguageDetectionModelStatus(
+      interface_broker, std::move(callback));
+}
+
 void LanguageDetectionModel::OnModelResponseReceived(
     CreateLanguageDetectionModelCallback callback,
     language_detection::LanguageDetectionModel* model) {
@@ -85,4 +94,11 @@
   std::move(on_complete).Run(predictions);
 }
 
+int64_t LanguageDetectionModel::GetModelSize() const {
+  if (!language_detection_model_->IsAvailable()) {
+    return 0;
+  }
+  return language_detection_model_->GetModelSize();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/language_detection/language_detection_model.h b/third_party/blink/renderer/platform/language_detection/language_detection_model.h
index 515fde3..81798ce 100644
--- a/third_party/blink/renderer/platform/language_detection/language_detection_model.h
+++ b/third_party/blink/renderer/platform/language_detection/language_detection_model.h
@@ -8,6 +8,7 @@
 #include "base/functional/callback_forward.h"
 #include "base/memory/raw_ref.h"
 #include "base/types/expected.h"
+#include "components/language_detection/content/common/language_detection.mojom-blink.h"
 #include "components/language_detection/core/language_detection_model.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
@@ -36,12 +37,20 @@
       base::expected<LanguageDetectionModel*, DetectLanguageError>;
   using CreateLanguageDetectionModelCallback =
       base::OnceCallback<void(MaybeModel)>;
+  using LanguageDetectionModelStatus =
+      language_detection::mojom::blink::LanguageDetectionModelStatus;
+  using LanguageDetectionModelStatusCallback =
+      language_detection::mojom::blink::ContentLanguageDetectionDriver::
+          GetLanguageDetectionModelStatusCallback;
 
   // Creates an instance and passes it to `callback` when the model has been
   // loaded (or we know that it will fail to load). `interface_broker` can be
   // used to communicate with the browser to find the model.
   static void Create(const blink::BrowserInterfaceBrokerProxy& interface_broker,
                      CreateLanguageDetectionModelCallback callback);
+  static void GetStatus(
+      const blink::BrowserInterfaceBrokerProxy& interface_broker,
+      LanguageDetectionModelStatusCallback callback);
 
   // Public for `MakeGarbageCollected`, use `Create` instead.
   explicit LanguageDetectionModel(
@@ -62,6 +71,8 @@
   void DetectLanguage(const WTF::String& text,
                       DetectLanguageCallback on_complete);
 
+  int64_t GetModelSize() const;
+
  private:
   // `Create` passes this to be called with the result of requesting a model.
   // It will call `callback` with the appropriate value based on the response.
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.cc b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
index 46f6d46..b40c488 100644
--- a/third_party/blink/renderer/platform/media/web_media_player_impl.cc
+++ b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
@@ -9,6 +9,7 @@
 #include <limits>
 #include <memory>
 #include <string>
+#include <string_view>
 #include <utility>
 
 #include "base/check.h"
@@ -24,6 +25,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/bind_post_task.h"
@@ -3936,38 +3938,42 @@
 
 template <uint32_t Flags, typename... T>
 void WebMediaPlayerImpl::WriteSplitHistogram(
-    void (*UmaFunction)(const std::string&, T...),
+    void (*UmaFunction)(std::string_view, T...),
     SplitHistogramName key,
     const T&... values) {
-  std::string strkey = std::string(GetHistogramName(key));
+  const char* strkey = GetHistogramName(key);
 
   if constexpr (Flags & kEncrypted) {
-    if (is_encrypted_)
-      UmaFunction(strkey + ".EME", values...);
+    if (is_encrypted_) {
+      UmaFunction(base::StrCat({strkey, ".EME"}), values...);
+    }
 #if BUILDFLAG(IS_WIN)
     if (renderer_type_ == media::RendererType::kMediaFoundation) {
-      UmaFunction(strkey + ".MediaFoundationRenderer", values...);
+      UmaFunction(base::StrCat({strkey, ".MediaFoundationRenderer"}),
+                  values...);
     }
 #endif  // BUILDFLAG(IS_WIN)
   }
 
-  if constexpr (Flags & kTotal)
-    UmaFunction(strkey + ".All", values...);
+  if constexpr (Flags & kTotal) {
+    UmaFunction(base::StrCat({strkey, ".All"}), values...);
+  }
 
   if constexpr (Flags & kPlaybackType) {
     auto demuxer_type = GetDemuxerType();
-    if (!demuxer_type.has_value())
+    if (!demuxer_type.has_value()) {
       return;
+    }
     switch (*demuxer_type) {
       case media::DemuxerType::kChunkDemuxer:
-        UmaFunction(strkey + ".MSE", values...);
+        UmaFunction(base::StrCat({strkey, ".MSE"}), values...);
         break;
       case media::DemuxerType::kManifestDemuxer:
       case media::DemuxerType::kMediaUrlDemuxer:
-        UmaFunction(strkey + ".HLS", values...);
+        UmaFunction(base::StrCat({strkey, ".HLS"}), values...);
         break;
       default:
-        UmaFunction(strkey + ".SRC", values...);
+        UmaFunction(base::StrCat({strkey, ".SRC"}), values...);
         break;
     }
   }
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.h b/third_party/blink/renderer/platform/media/web_media_player_impl.h
index ac2c639b..b4010f70 100644
--- a/third_party/blink/renderer/platform/media/web_media_player_impl.h
+++ b/third_party/blink/renderer/platform/media/web_media_player_impl.h
@@ -10,6 +10,7 @@
 #include <memory>
 #include <optional>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include "base/cancelable_callback.h"
@@ -388,7 +389,7 @@
   // so we won't even compile in strings such as "Media.TimeToPlayReady.All"
   // if it's not specified.
   template <uint32_t Flags, typename... T>
-  void WriteSplitHistogram(void (*UmaFunction)(const std::string&, T...),
+  void WriteSplitHistogram(void (*UmaFunction)(std::string_view, T...),
                            SplitHistogramName key,
                            const T&... value);
 
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 46d3de5..7a719ea 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -953,9 +953,9 @@
     {
       // CSS attr() function that accepts not only string types
       // and can be used in all properties.
-      // https://drafts.csswg.org/css-values-4/#attr-notation
+      // https://drafts.csswg.org/css-values-5/#attr-notation
       name: "CSSAdvancedAttrFunction",
-      status: "test",
+      status: "stable",
     },
     {
       // Let the visual position of the default anchor affect IMCB for
@@ -1081,12 +1081,6 @@
       status: "experimental",
     },
     {
-      // Flag so that we can Finch the effects of our SIMD fast-path for
-      // skipping lazily-parsed CSS declaration blocks faster.
-      name: "CSSLazyParsingFastPath",
-      status: "experimental"
-    },
-    {
       name: "CSSLineClamp",
       status: "experimental",
     },
@@ -1813,14 +1807,6 @@
       base_feature: "none",
     },
     {
-      name: "FedCmIdpSigninStatus",
-      depends_on: ["FedCm"],
-      public: true,
-      status: "stable",
-      base_feature: "none",
-      browser_process_read_access: true,
-    },
-    {
       name: "FedCmMultipleIdentityProviders",
       depends_on: ["FedCm"],
       base_feature: "none",
diff --git a/third_party/blink/renderer/platform/wtf/assertions.h b/third_party/blink/renderer/platform/wtf/assertions.h
index cd3e24dc..9af1f79 100644
--- a/third_party/blink/renderer/platform/wtf/assertions.h
+++ b/third_party/blink/renderer/platform/wtf/assertions.h
@@ -29,14 +29,21 @@
 
 #include <stdarg.h>
 
+#include "base/check.h"
 #include "base/compiler_specific.h"
-#include "base/dcheck_is_on.h"
 #include "base/logging.h"
 #include "third_party/blink/renderer/platform/wtf/wtf_export.h"
 
-#define DCHECK_AT(assertion, file, line)                            \
-  LAZY_STREAM(logging::LogMessage(file, line, #assertion).stream(), \
-              DCHECK_IS_ON() ? !(assertion) : false)
+#if DCHECK_IS_ON()
+
+#define DCHECK_AT(condition, location) \
+  LOGGING_CHECK_FUNCTION_IMPL(         \
+      ::logging::CheckError::DCheck(#condition, location), condition)
+#else
+
+#define DCHECK_AT(condition, location) EAT_CHECK_STREAM_PARAMS(!(condition))
+
+#endif  // DCHECK_IS_ON()
 
 // Users must test "#if ENABLE_SECURITY_ASSERT", which helps ensure that code
 // testing this macro has included this header.
diff --git a/third_party/blink/renderer/platform/wtf/assertions_test.cc b/third_party/blink/renderer/platform/wtf/assertions_test.cc
index 7bd63068..21ab669 100644
--- a/third_party/blink/renderer/platform/wtf/assertions_test.cc
+++ b/third_party/blink/renderer/platform/wtf/assertions_test.cc
@@ -14,10 +14,10 @@
   DCHECK(true);
 #if DCHECK_IS_ON()
   EXPECT_DEATH_IF_SUPPORTED(DCHECK(false), "");
-  EXPECT_DEATH_IF_SUPPORTED(DCHECK_AT(false, __FILE__, __LINE__), "");
+  EXPECT_DEATH_IF_SUPPORTED(DCHECK_AT(false, base::Location::Current()), "");
 #else
   DCHECK(false);
-  DCHECK_AT(false, __FILE__, __LINE__);
+  DCHECK_AT(false, base::Location::Current());
 #endif
 
   CHECK(true);
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 8116f37d..5d8cc2ad 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2684,6 +2684,8 @@
 
 # Sometimes flaky when run with headless shell via ChromeDriver.
 crbug.com/343720396 external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-unsafe-none.https.html?1-2 [ Crash Failure Timeout ]
+crbug.com/383880384 [ Mac ] external/wpt/css/css-properties-values-api/registered-property-change-style-002.html [ Pass Failure ]
+crbug.com/383880384 [ Win ] external/wpt/css/css-properties-values-api/registered-property-change-style-002.html [ Pass Failure ]
 
 # ====== New tests from wpt-importer added here ======
 crbug.com/384773801 [ Mac13 ] external/wpt/webrtc/RTCRtpReceiver-jitterBufferTarget.html [ Timeout ]
@@ -2709,8 +2711,6 @@
 crbug.com/383911311 [ Mac15 ] external/wpt/webrtc/RTCRtpParameters-encodings.html [ Timeout ]
 crbug.com/383999274 [ Mac13 ] external/wpt/css/css-layout-api/edges/padding-vrl.https.html [ Failure ]
 crbug.com/383999274 [ Win10.20h2 ] external/wpt/css/css-layout-api/edges/padding-vrl.https.html [ Failure ]
-crbug.com/383880384 [ Mac13 ] external/wpt/css/css-properties-values-api/registered-property-change-style-002.html [ Failure ]
-crbug.com/383880384 [ Win10.20h2 ] external/wpt/css/css-properties-values-api/registered-property-change-style-002.html [ Failure ]
 crbug.com/383825172 [ Mac11-arm64 ] external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-font-inheriting.tentative.html [ Failure ]
 crbug.com/383825172 [ Mac13 ] external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-font-inheriting.tentative.html [ Failure ]
 crbug.com/383825172 [ Mac15 ] external/wpt/html/semantics/forms/the-select-element/customizable-select/select-appearance-font-inheriting.tentative.html [ Failure ]
@@ -3213,6 +3213,8 @@
 crbug.com/338457111 [ Win11-arm64 ] external/wpt/fs/FileSystemFileHandle-move.https.any.worker.html [ Timeout ]
 crbug.com/338457112 [ Mac12 ] external/wpt/workers/Worker-terminate-forever-during-evaluation.html [ Timeout ]
 crbug.com/338457112 [ Win11-arm64 ] external/wpt/workers/Worker-terminate-forever-during-evaluation.html [ Timeout ]
+crbug.com/338513293 [ Mac13 ] virtual/fedcm-multi-idp/external/wpt/fedcm/fedcm-multi-idp/fedcm-multi-idp-mediation-optional.https.html [ Timeout ]
+crbug.com/338513293 [ Win10.20h2 ] virtual/fedcm-multi-idp/external/wpt/fedcm/fedcm-multi-idp/fedcm-multi-idp-mediation-optional.https.html [ Timeout ]
 crbug.com/338513293 [ Win11-arm64 ] virtual/fedcm-multi-idp/external/wpt/fedcm/fedcm-multi-idp/fedcm-multi-idp-mediation-optional.https.html [ Timeout ]
 crbug.com/338437452 [ Win11-arm64 ] external/wpt/html/semantics/embedded-content/bfcache/embedded-type-only.html [ Timeout ]
 crbug.com/338350366 [ Win11-arm64 ] external/wpt/preload/delaying-onload-link-preload-after-discovery.html [ Timeout ]
@@ -8865,3 +8867,6 @@
 
 # Gardener 2024-12-17
 crbug.com/384549646 virtual/threaded/external/wpt/css/css-view-transitions/navigation/chromium-paint-holding-timeout.html [ Failure Pass Timeout ]
+
+# Gardener 2024-12-18
+crbug.com/352331034 [ Debug Linux ] external/wpt/html/semantics/embedded-content/the-object-element/object-svg-only-for-print.html [ Failure Pass ]
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 36dea7a..74c9524 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
@@ -168793,8 +168793,8 @@
         {}
        ]
       ],
-      "webkit-line-clamp-abspos-001.html": [
-       "be7798c21195ad6fba0ac543e37d2d7c6d56b995",
+      "webkit-line-clamp-abspos-001.tentative.html": [
+       "fb8e027740d7991015313d62df86fbd147aa2f8b",
        [
         null,
         [
@@ -290460,7 +290460,7 @@
          ]
         ],
         "select-appearance-active.tentative.html": [
-         "3873969a2875d6f3ffcec5f788cc25477df9bed3",
+         "1efbed1a57585c600373590ff52da9e6ed7297f5",
          [
           null,
           [
@@ -290476,7 +290476,7 @@
              [
               [
                0,
-               29
+               33
               ],
               [
                0,
@@ -290505,7 +290505,7 @@
          ]
         ],
         "select-appearance-dark-mode.tentative.html": [
-         "d2ea44a20e417df9aed559bf8671214e766ce00e",
+         "57622ad7feed88085d3e2484d2d22a83b9e4e851",
          [
           null,
           [
@@ -290525,7 +290525,7 @@
               ],
               [
                0,
-               12
+               15
               ]
              ]
             ]
@@ -290565,7 +290565,7 @@
          ]
         ],
         "select-appearance-disabled-option.tentative.html": [
-         "b4cd7ba67e031b448c2fa5f6220b8ecea44d306b",
+         "cfc87b506864adc7c800f11f9ec78d6a5f21c768",
          [
           null,
           [
@@ -290581,7 +290581,7 @@
              [
               [
                0,
-               37
+               41
               ],
               [
                0,
@@ -290715,7 +290715,7 @@
          ]
         ],
         "select-appearance-font-inheriting.tentative.html": [
-         "f90e7c8896f90dd9022cf2aa13ba5f80fe204674",
+         "972b6d5dac047e02643679f0eb09c743ce5530d1",
          [
           null,
           [
@@ -290731,7 +290731,7 @@
              [
               [
                0,
-               50
+               55
               ],
               [
                0,
@@ -290745,7 +290745,7 @@
          ]
         ],
         "select-appearance-hover.tentative.html": [
-         "b5e24d07947c8918fc505256035d14b4943d61af",
+         "ec1a84d9042dcbed5a01a8e6cb04bf3a332cb1b1",
          [
           null,
           [
@@ -290761,7 +290761,7 @@
              [
               [
                0,
-               33
+               37
               ],
               [
                0,
@@ -290910,7 +290910,7 @@
          ]
         ],
         "select-appearance-switching-invalidation.tentative.html": [
-         "fd67d013a5641369e49745ebf6bbecaec1e36d1a",
+         "d02c2a523141657b4abc4d2dbddab7305d987421",
          [
           null,
           [
@@ -290926,7 +290926,7 @@
              [
               [
                0,
-               40
+               41
               ],
               [
                0,
@@ -291083,7 +291083,7 @@
          ]
         ],
         "select-open-invalidation.tentative.html": [
-         "10a441703be9ad0a49601de1159d63eea09e8b6e",
+         "9fe59fb1f664e903ff21fc885b9cc6d62a7dd6fe",
          [
           null,
           [
@@ -291099,7 +291099,7 @@
              [
               [
                0,
-               40
+               41
               ],
               [
                0,
@@ -291113,7 +291113,7 @@
          ]
         ],
         "select-option-images.tentative.html": [
-         "b0c8f279b700d9943a680f0886d38f3383ef233a",
+         "34678a0ae79c3dac89fbc127a0d7f59fd6d1ccd2",
          [
           null,
           [
@@ -291129,7 +291129,7 @@
              [
               [
                0,
-               40
+               41
               ],
               [
                0,
@@ -291173,7 +291173,7 @@
          ]
         ],
         "select-second-child-button.tentative.html": [
-         "ae216294ee54732a7bf39c2ef9e7ea669d99b05d",
+         "4affdee231cde9c91963e91313cdb5ab3f154aea",
          [
           null,
           [
@@ -291189,7 +291189,7 @@
              [
               [
                0,
-               37
+               41
               ],
               [
                0,
@@ -308177,7 +308177,7 @@
       []
      ],
      "idb-partitioned-coverage-iframe.html": [
-      "efbb133bcc80080651d28273567e9b07ce5e03f6",
+      "727067a3b77d110dc5c9831404f78cd57924d39d",
       []
      ],
      "idb-partitioned-persistence-iframe.html": [
@@ -308205,7 +308205,7 @@
       []
      ],
      "support-get-all.js": [
-      "7336f7e3c2c5d8fd0b140791131205f4309ba4cc",
+      "3b70b828b1375d4946b45941de0b3a115deaec5b",
       []
      ],
      "support-promises.js": [
@@ -391867,7 +391867,7 @@
           []
          ],
          "customizable-select-styles.css": [
-          "65b3c39019aec0a18e4f7997292f4b2b27c660a7",
+          "ac6d403cca2f0023a264addc39bad8424d2a82b7",
           []
          ],
          "customizable-select-utils.js": [
@@ -391884,7 +391884,7 @@
          ]
         },
         "select-appearance-active-ref.html": [
-         "9c62188a4934de12a1f0a7ecc2bdea96c0c054b3",
+         "879138cf6f13a46e3aac2e0cc879182c218d02e0",
          []
         ],
         "select-appearance-button-ref.html": [
@@ -391936,7 +391936,7 @@
          []
         ],
         "select-appearance-hover-ref.html": [
-         "fc658306da3d4ff96b99ea0e7398534712c3b996",
+         "8aef34cc3f36e3b39bfd5ed47f53424fc60c49dd",
          []
         ],
         "select-appearance-optgroup-legend-ref.html": [
@@ -403835,6 +403835,10 @@
        "fd3da53a29c3e7f55f950611d34694867b0ff0a4",
        []
       ],
+      "permissions-policy-focus-without-user-activation-tab-focus.html": [
+       "f612739dc986bc178742de5d15a8b1c56820b338",
+       []
+      ],
       "permissions-policy-focus-without-user-activation.html": [
        "c802d6f06999e58e927fa52c08cfb4d81423e768",
        []
@@ -420071,6 +420075,10 @@
     ]
    },
    "webnn": {
+    "DIR_METADATA": [
+     "f756e007f54c112adb3f269ed0b86e45502cb0ca",
+     []
+    ],
     "META.yml": [
      "6b22a19db920390ef34e86711fc399569db31e13",
      []
@@ -430414,7 +430422,7 @@
      ]
     ],
     "idbindex_getAll.any.js": [
-     "acafde459097dbe98d6f0fe5ae05b9c54f066d54",
+     "f817758e60342482daefe0dfa589a60bb41a365f",
      [
       "IndexedDB/idbindex_getAll.any.html",
       {
@@ -430442,8 +430450,13 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ],
      [
@@ -430473,8 +430486,13 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ],
      [
@@ -430504,8 +430522,13 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ],
      [
@@ -430535,13 +430558,18 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ]
     ],
     "idbindex_getAllKeys.any.js": [
-     "53171c5b6a0a4de022832b6376731544c8fa5198",
+     "34bab09d158d2020a7c6f85ca76f2eaa32946841",
      [
       "IndexedDB/idbindex_getAllKeys.any.html",
       {
@@ -430569,8 +430597,13 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ],
      [
@@ -430600,8 +430633,13 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ],
      [
@@ -430631,8 +430669,13 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ],
      [
@@ -430662,13 +430705,18 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ]
     ],
     "idbindex_getAllRecords.tentative.any.js": [
-     "a644079a0d9023beb3c50caebf06ab8dbc4bc0b2",
+     "b6929854def189ab9602d35100ac337fc67023f2",
      [
       "IndexedDB/idbindex_getAllRecords.tentative.any.html",
       {
@@ -430696,8 +430744,13 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ],
      [
@@ -430727,8 +430780,13 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ],
      [
@@ -430758,8 +430816,13 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ],
      [
@@ -430789,8 +430852,13 @@
         [
          "script",
          "resources/support-promises.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ]
     ],
@@ -504005,49 +504073,49 @@
        ]
       ],
       "at-rule-in-layer-cascade-external-stylesheet.html": [
-       "53c6135a566cb256079d480bb9b4b1f7a0be3ea4",
+       "4cd3acfb00c4c456adfe5f7c3fa1ae54cf4c1669",
        [
         null,
         {}
        ]
       ],
       "at-rule-in-layer-cascade.html": [
-       "a38ca48e8c41426c73801173d1a9516b2a1caeff",
+       "b3de3b1fb68f4891d7045307be0f659c7e86149d",
        [
         null,
         {}
        ]
       ],
       "at-rule-in-layer.html": [
-       "63ec4c3e25d24abd5e0e5e24cfd612487ae2c4c3",
+       "7823c613c24115ab0bb8b4b3a6e1034ff6a8172a",
        [
         null,
         {}
        ]
       ],
       "at-rule-in-matching-media.html": [
-       "77f2e05c340320fcc1a16c0135b0c85ef8157c91",
+       "0d220c3f03d8427df97185de62fb3a510439dae8",
        [
         null,
         {}
        ]
       ],
       "at-rule-in-non-matching-media.html": [
-       "ac9dbde37e183ac5f559b2a2af6434add43786f9",
+       "8a0dc976b26224f570dc151420c94e493647d73e",
        [
         null,
         {}
        ]
       ],
       "at-rule-in-shadow-dom.html": [
-       "7edd8e0749f7c77f1257423c5838ae0bcb0b263b",
+       "6afa9d58b613dc5686ebf4f70bbbb9ba75ad212a",
        [
         null,
         {}
        ]
       ],
       "at-rule-multiple-rules.html": [
-       "5a84d46da1884016bdf40022473a732e94d7a423",
+       "54dc54929eb4b739c61c41d023cb5c7865e90ff2",
        [
         null,
         {}
@@ -504061,7 +504129,7 @@
        ]
       ],
       "hide-before-reveal.html": [
-       "7cdbcb46280bd352c72f7ce9aa3802fae5e319e2",
+       "eda039ec185cde4a82c22c38aa09fafd1c86efed",
        [
         null,
         {
@@ -504071,7 +504139,7 @@
        ]
       ],
       "mismatched-snapshot-containing-block-size-skips.html": [
-       "4a682cc66fd9a9209a41fb4cf3f875467c58ce49",
+       "c77980bdb2e7c8b900ed6a9fd116185d43382ecf",
        [
         null,
         {
@@ -504094,14 +504162,14 @@
        ]
       ],
       "pagereveal-microtask-sequence.html": [
-       "205f4d1ddcfb71d60788af58c77e6b12957336c3",
+       "bb06b1c31ab53ba06ac93378ee4684185a75a7e8",
        [
         null,
         {}
        ]
       ],
       "pagereveal-no-view-transition-new-opt-out.html": [
-       "a8b314b751f57b7d237779b5cbf90c8cca66ab3f",
+       "580870e40fa55df83ec38c92f2e203bb10d2f63b",
        [
         null,
         {}
@@ -504115,14 +504183,14 @@
        ]
       ],
       "pagereveal-updatecallbackdone-promise.html": [
-       "3d259e66a2051dca2498f4ed4099c61d9f0dfb1c",
+       "d41b8167015d2a89a9b1678e41df5ecce22ca528",
        [
         null,
         {}
        ]
       ],
       "pagereveal-with-view-transition.html": [
-       "3f21d56ed688bee743b13d7bdd7679f851f16485",
+       "cdd65d19f52e166362604ee770e51bf4062d5bbe",
        [
         null,
         {}
@@ -504136,7 +504204,7 @@
        ]
       ],
       "pageswap-in-hidden-doc-should-skip-transition.html": [
-       "5be3b6cb27ce915eea1711caa93d4adee4e4f35b",
+       "d8a903aab02a3969ebfcc782e51ca83bb413d879",
        [
         null,
         {
@@ -504145,14 +504213,14 @@
        ]
       ],
       "pageswap-long-delay.html": [
-       "e6ef6d80dc26b81dd7f99b0cb40c7e7c59bf3608",
+       "78e4efc58d810c26a7e2a348299f9dc0edb6e585",
        [
         null,
         {}
        ]
       ],
       "pageswap-push-from-click.html": [
-       "16e04c89bfe380e3c51b52dbd8e27db3316127f0",
+       "fc9febaf5d412ea5e914da590ede1b478e3b032e",
        [
         null,
         {
@@ -504161,35 +504229,35 @@
        ]
       ],
       "pageswap-push-navigation.html": [
-       "50a43e70d90eb04251ab1017113b69f6120116db",
+       "888c8b605995a97db8d24f49179aa3d56439c6a8",
        [
         null,
         {}
        ]
       ],
       "pageswap-push-with-redirect.html": [
-       "d9d252f83ce7116754a65ee272c698b0e3c41b15",
+       "745151e762ed8cdf26771b293996683912a79079",
        [
         null,
         {}
        ]
       ],
       "pageswap-replace-navigation.html": [
-       "18f63454fdf8ce59244ac6ff40563ba1461295a1",
+       "6e9d487177fcfaa565e7500c7e0704d7aaea5c4c",
        [
         null,
         {}
        ]
       ],
       "pageswap-skip-transition.html": [
-       "bfeee7827a31cb4ca0b78d4c43ccbf53f1d698cc",
+       "9e5554d6ec4e251adedd82afe06546e559541b65",
        [
         null,
         {}
        ]
       ],
       "pageswap-traverse-navigation-no-bfcache.https.html": [
-       "9137dc4d1cd18da10ff2ac4c74e1e007d7fdfc04",
+       "7366fc5b5c274aa9e3910cbb1514ebb1afa4791d",
        [
         null,
         {}
@@ -504213,21 +504281,21 @@
         ]
        ],
        "navigation-supersedes-types-same-rule.html": [
-        "23dc9d4ca983d708a68279af1aadd107b2d6aed8",
+        "a8697597cafc774bae2932e28db7edc3d3c8ce23",
         [
          null,
          {}
         ]
        ],
        "navigation-supersedes-types-when-after.html": [
-        "1fd28d97a6ee45010d19216b8f71bd9dd5017b43",
+        "3d8cb6f717804feb4bfac952d24e596ea24437d2",
         [
          null,
          {}
         ]
        ],
        "types-in-pagereveal-and-pageswap.html": [
-        "2c12fece3c0990cf4991341b0dd0c75c927f7727",
+        "ffb3efe16cab34aa8c01615c45bba78cb31ea334",
         [
          null,
          {}
@@ -504235,7 +504303,7 @@
        ]
       },
       "zero-named-elements.html": [
-       "e6061de2a8b01584308a535a991f11927460e79c",
+       "30592c8f3ee757e76f7255f126a2d7db63d32829",
        [
         null,
         {}
@@ -620319,7 +620387,7 @@
          ]
         ],
         "select-mouse-behavior.tentative.html": [
-         "d06330f5f639d86e6a6f59bbf011d1e2de78669f",
+         "f9c873eb85237dbb1341aea61c51bd9650a60aa4",
          [
           null,
           {
@@ -620346,7 +620414,7 @@
          ]
         ],
         "select-option-hover-styles.tentative.html": [
-         "48b1a56071ecad50686ffd0b320294cc3d02a003",
+         "0df62f0810ef0bd52b8be40e3698104ee38427e7",
          [
           null,
           {
@@ -651690,6 +651758,24 @@
        {}
       ]
      ],
+     "focus-without-user-activation-disabled-by-permissions-policy-cross-origin.tentative.https.sub.html": [
+      "a62ca0b581d30877e4cea6fedad8a18a56e03b15",
+      [
+       null,
+       {
+        "testdriver": true
+       }
+      ]
+     ],
+     "focus-without-user-activation-disabled-by-permissions-policy.tentative.https.sub.html": [
+      "bd43848ec115ca1ca143d4871bb5826e78aa55a4",
+      [
+       null,
+       {
+        "testdriver": true
+       }
+      ]
+     ],
      "focus-without-user-activation-disabled-tentative.html": [
       "3980fd1219cba990454ffa86e0a5bd493b9eb5e6",
       [
@@ -679886,6 +679972,13 @@
       {}
      ]
     ],
+    "web-locks-header-batch-update.tentative.https.sub.html": [
+     "9c79da34cfb413222e1b86a4cc91b670f0014727",
+     [
+      null,
+      {}
+     ]
+    ],
     "web-locks-header-modifier-method.tentative.https.sub.html": [
      "05ec7bf82bd146bb307bc627235d2edfb9f8f7f0",
      [
@@ -700337,7 +700430,7 @@
        ]
       ],
       "SVGGeometryElement.getTotalLength-01.svg": [
-       "0cf77bf86673074175edd02f92413ea15f111369",
+       "412afe7b730a9fadddf6b7c27e2688c5ebffd7f0",
        [
         null,
         {}
@@ -701133,14 +701226,14 @@
      ]
     ],
     "WorkerGlobalScope-eval.html": [
-     "9248784924d003c41620745dda2fe92fa42662e0",
+     "cdec742cb21a11859bb1e4da5871721ba0feec49",
      [
       null,
       {}
      ]
     ],
     "WorkerGlobalScope-importScripts.html": [
-     "9853b1bc44845155ef889b7b5ee93c877844e019",
+     "d6e5d9b43d4c1b95ab1899316de6082a47d8038b",
      [
       null,
       {}
diff --git a/third_party/blink/web_tests/external/wpt/ai/language_detection/canDetect.tentative.window.js b/third_party/blink/web_tests/external/wpt/ai/language_detection/canDetect.tentative.window.js
deleted file mode 100644
index a69d178..0000000
--- a/third_party/blink/web_tests/external/wpt/ai/language_detection/canDetect.tentative.window.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// META: title=canDetect
-
-'use strict';
-
-promise_test(async t => {
-  const canDetect = await translation.canDetect();
-  assert_greater_than(canDetect.length, 0);
-  assert_not_equals(canDetect, "no");
-});
diff --git a/third_party/blink/web_tests/external/wpt/ai/language_detection/detect-en.tentative.window.js b/third_party/blink/web_tests/external/wpt/ai/language_detection/detect-en.tentative.window.js
deleted file mode 100644
index b4494d4..0000000
--- a/third_party/blink/web_tests/external/wpt/ai/language_detection/detect-en.tentative.window.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// META: title=Detect english
-
-'use strict';
-
-promise_test(async t => {
-  const detector = await translation.createDetector();
-  const results = await detector.detect("this string is in English");
-  // "en" should be highest confidence.
-  assert_equals(results[0].detectedLanguage, "en");
-  // Results should be from high to low confidence.
-  for (let i = 0; i < results.length - 1; i++) {
-    assert_greater_than_equal(results[i].confidence, results[i + 1].confidence);
-  }
-});
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-009.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-009.html
new file mode 100644
index 0000000..6eb8837f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-009.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<title>Anchor-positioned elements in multicol with spanner</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#anchor-pos">
+<style>
+  .anchor {
+    anchor-name: --tjor;
+    inline-size: 50px;
+    background: green;
+  }
+  .pos {
+    position: absolute;
+    position-anchor: --tjor;
+    inset-inline-start: anchor(outside);
+    inset-block-start: anchor(start);
+    inline-size: 50px;
+    background: green;
+  }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns:2; inline-size:300px;">
+  <div style="position:relative; block-size:100px;">
+    <div style="inline-size:100px; block-size:50px; background:red;">
+      <div class="anchor" style="block-size:50px;"></div>
+      <div class="pos" style="block-size:50px;"></div>
+    </div>
+  </div>
+  <div style="column-span:all; inline-size:100px; block-size:10px; background:green; "></div>
+  <div style="position:relative; block-size:80px;">
+    <div style="inline-size:100px; block-size:40px; background:red;">
+      <div class="anchor" style="block-size:40px;"></div>
+      <div class="pos" style="block-size:40px;"></div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-010.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-010.html
new file mode 100644
index 0000000..6f49f3c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-010.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<title>Anchor-positioned elements in multicol with spanner, vertical-rl</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#anchor-pos">
+<style>
+  .anchor {
+    anchor-name: --tjor;
+    inline-size: 50px;
+    background: green;
+  }
+  .pos {
+    position: absolute;
+    position-anchor: --tjor;
+    inset-inline-start: anchor(outside);
+    inset-block-start: anchor(start);
+    inline-size: 50px;
+    background: green;
+  }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="writing-mode:vertical-rl; columns:2; inline-size:300px;">
+  <div style="position:relative; block-size:100px;">
+    <div style="inline-size:100px; block-size:50px; background:red;">
+      <div class="anchor" style="block-size:50px;"></div>
+      <div class="pos" style="block-size:50px;"></div>
+    </div>
+  </div>
+  <div style="column-span:all; inline-size:100px; block-size:10px; background:green; "></div>
+  <div style="position:relative; block-size:80px;">
+    <div style="inline-size:100px; block-size:40px; background:red;">
+      <div class="anchor" style="block-size:40px;"></div>
+      <div class="pos" style="block-size:40px;"></div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGGeometryElement.getTotalLength-01.svg b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGGeometryElement.getTotalLength-01.svg
index 0cf77bf..412afe7 100644
--- a/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGGeometryElement.getTotalLength-01.svg
+++ b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGGeometryElement.getTotalLength-01.svg
@@ -51,5 +51,23 @@
       document.documentElement.removeChild(rect);
     }
 }, document.title+', getTotalLength - rect in document with percent units');
+
+test(function() {
+    let g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
+    document.documentElement.appendChild(g);
+    g.style.display = "none";
+    let rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
+    g.appendChild(rect);
+    try {
+      rect.setAttribute('width', '100');
+      rect.setAttribute('height', '100');
+      assert_equals(rect.getTotalLength(), 400);
+      rect.setAttribute('width', '50');
+      rect.setAttribute('height', '50');
+      assert_equals(rect.getTotalLength(), 200);
+    } finally {
+      document.documentElement.removeChild(g);
+    }
+}, document.title+', getTotalLength - rect in document with display none');
   </script>
 </svg>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/WorkerGlobalScope-eval.html b/third_party/blink/web_tests/external/wpt/trusted-types/WorkerGlobalScope-eval.html
index 92487849..cdec742 100644
--- a/third_party/blink/web_tests/external/wpt/trusted-types/WorkerGlobalScope-eval.html
+++ b/third_party/blink/web_tests/external/wpt/trusted-types/WorkerGlobalScope-eval.html
@@ -16,8 +16,10 @@
 // setup, and then have additional policies for the actual test cases.
 //
 // For the same reason we cannot use the otherwise preferred 'META: workers'
-// tag, since that test setup would be blocked as soon as trusted types
-// enforcement is enabled.
+// tag
+// (https://web-platform-tests.org/writing-tests/testharness.html#tests-for-other-or-multiple-globals-any-js),
+// since that test setup would be blocked as soon as trusted types enforcement
+// is enabled.
 const test_setup_policy = trustedTypes.createPolicy("hurrayanythinggoes", {
   createScriptURL: x => x});
 const test_url =
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/WorkerGlobalScope-importScripts.html b/third_party/blink/web_tests/external/wpt/trusted-types/WorkerGlobalScope-importScripts.html
index 9853b1b..d6e5d9b 100644
--- a/third_party/blink/web_tests/external/wpt/trusted-types/WorkerGlobalScope-importScripts.html
+++ b/third_party/blink/web_tests/external/wpt/trusted-types/WorkerGlobalScope-importScripts.html
@@ -16,8 +16,10 @@
 // setup, and then have additional policies for the actual test cases.
 //
 // For the same reason we cannot use the otherwise preferred 'META: workers'
-// tag, since that test setup would be blocked as soon as trusted types
-// enforcement is enabled.
+// tag
+// (https://web-platform-tests.org/writing-tests/testharness.html#tests-for-other-or-multiple-globals-any-js),
+// since that test setup would be blocked as soon as trusted types enforcement
+// is enabled.
 const test_setup_policy = trustedTypes.createPolicy("hurrayanythinggoes", {
   createScriptURL: x => x});
 const test_url =
diff --git a/third_party/boringssl/src b/third_party/boringssl/src
index 9338cc2..ca3146c 160000
--- a/third_party/boringssl/src
+++ b/third_party/boringssl/src
@@ -1 +1 @@
-Subproject commit 9338cc251292124d3bc49b2f790a69f9ad87d5f3
+Subproject commit ca3146c5630035d07de160743a39a22125bf80c4
diff --git a/third_party/bspatch/README.chromium b/third_party/bspatch/README.chromium
index 7f47dae..ad730e6 100644
--- a/third_party/bspatch/README.chromium
+++ b/third_party/bspatch/README.chromium
@@ -1,6 +1,7 @@
 Name: bspatch
 URL: https://github.com/mozilla-services/services-central-legacy/tree/master/toolkit/mozapps/update/updater
-Version: unknown
+Version: N/A
+Revision: 465265d0d473d107b76e74d969199eaf2cdc8750
 License: BSD-2-Clause
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/catapult b/third_party/catapult
index 6349b2a..d744660 160000
--- a/third_party/catapult
+++ b/third_party/catapult
@@ -1 +1 @@
-Subproject commit 6349b2a0fe82a0f7b941c066fa4e0de03b5fccfa
+Subproject commit d74466096c7fdd9f55c7c2516f0dced564e5f30d
diff --git a/third_party/cros-components/src b/third_party/cros-components/src
index 4382ff6..a155e2d0 160000
--- a/third_party/cros-components/src
+++ b/third_party/cros-components/src
@@ -1 +1 @@
-Subproject commit 4382ff679d80fc174d54bc2e89ef0079520e5880
+Subproject commit a155e2d0d2827dcbcbbe2751d98851f75705585e
diff --git a/third_party/crossbench b/third_party/crossbench
index ec04484..883775b 160000
--- a/third_party/crossbench
+++ b/third_party/crossbench
@@ -1 +1 @@
-Subproject commit ec04484249c02607583033d717821359b7a0afeb
+Subproject commit 883775bd2fd7de0c22acacc1cb150f44ff4b6e94
diff --git a/third_party/dawn b/third_party/dawn
index 9c149a5..d73d332 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 9c149a580bd4e6958435524b0391120d8f7e07e0
+Subproject commit d73d332c6b0ab0f178ac25cac88a02bdf7482c8f
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 435b93d..0372032 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 435b93d9d72ecd3e120010bdcb955aab030afb75
+Subproject commit 037203201c416c40a7693c54c8d9c2f5d71e34f2
diff --git a/third_party/skia b/third_party/skia
index e56496e..2cf673f 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit e56496eb35a3e20114d1a0052348e43b363f3cd4
+Subproject commit 2cf673f5ebbb1c2a3688a73fa66c1d0110a7bd38
diff --git a/third_party/webrtc b/third_party/webrtc
index b766572..b2120cb 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit b766572d2b4aaa82b644a12a9413794da5e02e56
+Subproject commit b2120cb723c7fd4f92a4a2486f1d0e437066a462
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index ae7b881..31961a00 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -17894,6 +17894,7 @@
   <int value="-1008130438" label="PageEntitiesPageContentAnnotations:enabled"/>
   <int value="-1007985511" label="SidePanelJourneys:enabled"/>
   <int value="-1007961880" label="PrivacySandboxSettings:enabled"/>
+  <int value="-1007888320" label="(Obsolete) LacrosOnly:enabled"/>
   <int value="-1007873730" label="TabGroupsSaveUIUpdate:enabled"/>
   <int value="-1007856269" label="CssSelectorFragmentAnchor:disabled"/>
   <int value="-1007267652"
@@ -18928,6 +18929,7 @@
       label="history-clusters-should-show-all-clusters-on-prominent-ui-surfaces"/>
   <int value="-588163454"
       label="AccessibilitySelectToSpeakHoverTextImprovements:enabled"/>
+  <int value="-587446483" label="(Obsolete) LacrosOnly:disabled"/>
   <int value="-587318376" label="FilesConflictDialog:disabled"/>
   <int value="-587025390" label="GetAllScreensMedia:enabled"/>
   <int value="-586476210" label="AppInstallServiceUriBorealis:disabled"/>
@@ -20448,7 +20450,6 @@
   <int value="21055794" label="OpenXR:enabled"/>
   <int value="21641175" label="OptimizeEarlyNavigation:disabled"/>
   <int value="22142588" label="OptimizationGuidePushNotifications:disabled"/>
-  <int value="22202990" label="LacrosOnly:disabled"/>
   <int value="22322436" label="AutofillEnablePaymentsMandatoryReauth:disabled"/>
   <int value="23121136" label="MobileIdentityConsistencyVar:enabled"/>
   <int value="23556595" label="MarkHttpAs:enabled"/>
@@ -21687,7 +21688,6 @@
   <int value="511179195" label="ShoppingAssist:disabled"/>
   <int value="511392922" label="SharedClipboardReceiver:enabled"/>
   <int value="511522097" label="CrostiniTerminaDlcForceOta:enabled"/>
-  <int value="512143128" label="LacrosOnly:enabled"/>
   <int value="512508240" label="WebViewExtraHeadersSameDomainOnly:disabled"/>
   <int value="513258875" label="WinrtSensorsImplementation:disabled"/>
   <int value="513356954" label="InstantTethering:disabled"/>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index 575ca86..b5e77db 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -1854,70 +1854,6 @@
   </summary>
 </histogram>
 
-<histogram
-    name="Android.Fonts.TimeDownloadableFontsRetrievedAfterFirstDraw{ActivityType}"
-    units="ms" expires_after="2025-04-20">
-  <owner>sinansahin@google.com</owner>
-  <owner>twellington@chromium.org</owner>
-  <summary>
-    Time it took to retrieve the downloadable fonts after the first draw of
-    {ActivityType}'s content view. Mutually exclusive with *BeforeFirstDraw.
-    Recorded when all downloadable fonts are retrieved.
-  </summary>
-  <token key="ActivityType" variants="ActivityType"/>
-</histogram>
-
-<histogram
-    name="Android.Fonts.TimeDownloadableFontsRetrievedAfterPostInflationStartup{ActivityType}"
-    units="ms" expires_after="2024-12-15">
-  <owner>sinansahin@google.com</owner>
-  <owner>twellington@chromium.org</owner>
-  <summary>
-    Time it took to retrieve the downloadable fonts after post-inflation
-    startup. Mutually exclusive with *BeforePostInflationStartup. Recorded when
-    all downloadable fonts are retrieved. {ActivityType}
-  </summary>
-  <token key="ActivityType" variants="ActivityType"/>
-</histogram>
-
-<histogram
-    name="Android.Fonts.TimeDownloadableFontsRetrievedBeforeFirstDraw{ActivityType}"
-    units="ms" expires_after="2025-04-20">
-  <owner>sinansahin@google.com</owner>
-  <owner>twellington@chromium.org</owner>
-  <summary>
-    Amount of time the downloadable fonts were retrieved before the first draw.
-    Mutually exclusive with *AfterFirstDraw. Recorded when the first #onDraw
-    call happens for the {ActivityType}'s content view.
-  </summary>
-  <token key="ActivityType" variants="ActivityType"/>
-</histogram>
-
-<histogram
-    name="Android.Fonts.TimeDownloadableFontsRetrievedBeforePostInflationStartup{ActivityType}"
-    units="ms" expires_after="2024-12-15">
-  <owner>sinansahin@google.com</owner>
-  <owner>twellington@chromium.org</owner>
-  <summary>
-    Amount of time the downloadable fonts were retrieved before post-inflation
-    startup. Mutually exclusive with *AfterPostInflationStartup. Recorded after
-    AsyncInitializationActivity#performPostInflationStartup. {ActivityType}
-  </summary>
-  <token key="ActivityType" variants="ActivityType"/>
-</histogram>
-
-<histogram
-    name="Android.Fonts.TimeToRetrieveDownloadableFontsAfterOnCreate{ActivityType}"
-    units="ms" expires_after="2024-12-15">
-  <owner>sinansahin@google.com</owner>
-  <owner>twellington@chromium.org</owner>
-  <summary>
-    Time it took to retrieve the downloadable fonts after Application#OnCreate.
-    Recorded when all downloadable fonts are retrieved. {ActivityType}
-  </summary>
-  <token key="ActivityType" variants="ActivityType"/>
-</histogram>
-
 <histogram name="Android.FrameTimelineJank.Duration{JankScenario}" units="ms"
     expires_after="2025-05-11">
   <owner>oksamyt@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/enums.xml b/tools/metrics/histograms/metadata/enterprise/enums.xml
index e0598954..38f3020 100644
--- a/tools/metrics/histograms/metadata/enterprise/enums.xml
+++ b/tools/metrics/histograms/metadata/enterprise/enums.xml
@@ -2196,6 +2196,7 @@
   <int value="1322" label="DeviceFlexArcPreloadEnabled"/>
   <int value="1323" label="AllowedInputMethodsForceEnabled"/>
   <int value="1324" label="WebRtcIPHandlingUrl"/>
+  <int value="1325" label="GenAIPhotoEditingSettings"/>
 </enum>
 
 <enum name="EnterprisePoliciesSources">
diff --git a/tools/metrics/histograms/metadata/net/enums.xml b/tools/metrics/histograms/metadata/net/enums.xml
index b4e9482..407fb17 100644
--- a/tools/metrics/histograms/metadata/net/enums.xml
+++ b/tools/metrics/histograms/metadata/net/enums.xml
@@ -2867,6 +2867,10 @@
      https://learn.microsoft.com/en-us/windows/win32/com/com-error-codes-6
      with some amendments-->
 
+  <int value="-2146893808" label="NTE_PERM">Access denied.</int>
+  <int value="-2146893785" label="NTE_INVALID_PARAMETER">
+    The parameter is incorrect.
+  </int>
   <int value="-2144862208" label="TPM_E_ERROR_MASK">
     This is an error mask to convert TPM hardware errors to win errors.
   </int>
@@ -3465,6 +3469,16 @@
     TPM 2.0: the command may require writing of NV and NV is not current
     accessible..
   </int>
+  <int value="-2144845823" label="TBS_E_INTERNAL_ERROR">
+    An internal error has occurred within the Trusted Platform Module support
+    program.
+  </int>
+  <int value="-2144845822" label="TBS_E_BAD_PARAMETER">
+    One or more input parameters is bad.
+  </int>
+  <int value="-2144795641" label="TPM_E_PCP_INTERNAL_ERROR">
+    An unexpected internal error has occurred in the Platform Crypto Provider.
+  </int>
 </enum>
 
 <enum name="ZeroRttState">
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index e97bf20a..042fefb 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -2440,7 +2440,7 @@
   </token>
 </histogram>
 
-<histogram name="Net.HttpStreamPool.JobCreateToResultTime.{Result}" units="ms"
+<histogram name="Net.HttpStreamPool.JobCreateToResumeTime.{Result}" units="ms"
     expires_after="2025-02-27">
   <owner>bashi@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml
index a6bc90e..4155547 100644
--- a/tools/metrics/histograms/metadata/omnibox/histograms.xml
+++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -2727,23 +2727,6 @@
 </histogram>
 
 <histogram
-    name="Omnibox.{SearchPrefetch}.NavigationURLMatches.NavigationPrefetch.{NavigationPrefetchOnly}"
-    enum="Boolean" expires_after="2023-10-15">
-  <owner>ryansturm@chromium.org</owner>
-  <owner>chrome-omnibox-team@google.com</owner>
-  <summary>
-    {SearchPrefetch}
-
-    Whether the prefetch URL and the navigation URL are an exact match including
-    query params in the URL. Recorded upon navigation to a matching search term.
-
-    {NavigationPrefetchOnly}
-  </summary>
-  <token key="SearchPrefetch" variants="SearchPrefetch"/>
-  <token key="NavigationPrefetchOnly" variants="NavigationPrefetchOnly"/>
-</histogram>
-
-<histogram
     name="Omnibox.{SearchPrefetch}.PrefetchEligibilityReason2.{NavigationOrSuggestionPrefetch}"
     enum="SearchPrefetchEligibilityReason" expires_after="2025-05-11">
   <owner>ryansturm@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index 32936c9..8075934 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -3460,14 +3460,22 @@
 </histogram>
 
 <histogram
-    name="PageLoad.Internal.Prerender2.DomContentLoadedToActivation{PreloadingTriggerType}"
+    name="PageLoad.Internal.Prerender2.DomContentLoadedToActivation2{PreloadingTriggerType}"
     units="ms" expires_after="2025-05-11">
   <owner>lingqi@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
     Records the duration from DOMContentLoaded to activation for a prerendered
-    and then activated page. If the DOMContentLoaded event is fired after
-    activation, the number will be negative.
+    and then activated page.
+
+    Note that the duration is shifted by 1 minute (60000ms) when recording the
+    metric, because UMA cannot record negative values.
+
+    If the DOMContentLoaded event is fired after activation, the number will be
+    less than 60000(ms).
+
+    If the DOMContentLoaded event is fired before activation, the number will be
+    greater than 60000(ms).
 
     This metric will be recorded when a session ends, at
     PrerenderPageLoadMetricsObserver::MaybeRecordDocumentLoadMetrics.
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index 9e666e3..6675621 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -345,7 +345,7 @@
     name="PasswordGeneration.EditsInGeneratedPassword.AlteredLengthIncreased"
     enum="GeneratedPasswordAlteredLengthIncreased" expires_after="2025-04-13">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     Measures difference in length between generated password and submitted
     password. False if length decreased, true if length increased. Uploaded once
@@ -356,7 +356,7 @@
 <histogram name="PasswordGeneration.EditsInGeneratedPassword.AttributesMask"
     enum="EditsInGeneratedPasswordMask" expires_after="2025-04-13">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     Measures types of user editing of generated passwords. Mask tracks if there
     are several types of changes simultaneously happening on generated password.
@@ -367,7 +367,7 @@
 <histogram name="PasswordGeneration.EditsInGeneratedPassword.{CharacterClass}"
     enum="CharacterClassPresenceChange" expires_after="2025-05-04">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     Measures difference in {CharacterClass} between generated password and
     submitted password. Uploaded once per modified generated password
@@ -401,7 +401,7 @@
 <histogram name="PasswordGeneration.GeneratedPasswordWasEdited"
     enum="BooleanGeneratedPasswordWasEdited" expires_after="2025-05-11">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     Measures the frequency of user editing of generated passwords. Uploaded once
     per generated password save. Applicable to automatic and manual generations.
@@ -469,7 +469,7 @@
 <histogram name="PasswordGeneration.SubmissionAvailableEvent"
     enum="PasswordSubmissionEvent" expires_after="M137">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <owner>chrome-password-manager-metrics-alerts@google.com</owner>
   <summary>
     Measures the frequency of submission events for passwords that could have
@@ -481,7 +481,7 @@
 <histogram name="PasswordGeneration.SubmissionEvent"
     enum="PasswordSubmissionEvent" expires_after="2025-05-11">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     Measures the frequency of submission events for generated passwords. This is
     similar to PasswordManager.ActionsTakenWithPsl but only tracks events which
@@ -1646,7 +1646,7 @@
 <histogram name="PasswordManager.FillingAutomationRate" units="%"
     expires_after="2025-04-20">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     Records the percentage of input text field characters that were autofilled.
     This function measures text input as a number of UTF-16 code points.
@@ -1765,7 +1765,7 @@
 <histogram name="PasswordManager.GeneratedFormHasNoFormManager"
     enum="BooleanFormManager" expires_after="2025-04-13">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     When the generation state of a password was changed, records whether an
     existing form corresponding to the password was found.
@@ -2451,7 +2451,7 @@
 <histogram name="PasswordManager.ParserDetectedOtpFieldWithRegex"
     enum="Boolean" expires_after="2025-06-08">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     Reports whether the form parser has detected an OTP field with regex.
     Reported any time when the parser processes a form. Used to compare how
@@ -3842,7 +3842,7 @@
     name="PasswordManager.SingleUsername.ForgotPasswordServerPredictionUsed"
     enum="Boolean" expires_after="2025-05-11">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     Recorded when a single username form is detected using server predictions.
     Records whether the prediction is SINGLE_USERNAME_FORGOT_PASSWORD.
@@ -3852,7 +3852,7 @@
 <histogram name="PasswordManager.SingleUsername.PasswordFormHadUsernameField"
     enum="PasswordFormHadUsernameField" expires_after="2025-04-13">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     Single username vote is sent after user is signed in (i.e. entered password
     in password form). This means that there are actually 2 forms in username
@@ -3873,7 +3873,7 @@
 <histogram name="PasswordManager.SingleUsername.VoteDataAvailability"
     enum="SingleUsernameVoteDataAvailability" expires_after="2025-05-11">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     This metric records whether username first and forgot password form voting
     data is available, and whether it contains information about the same form.
@@ -3928,7 +3928,7 @@
 <histogram name="PasswordManager.SubmittedFormType2" enum="PasswordFormType2"
     expires_after="2025-05-11">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <owner>chrome-password-manager-metrics-alerts@google.com</owner>
   <summary>
     The presumed type (e.g. signup, login, change password) of all submitted
@@ -3940,7 +3940,7 @@
 <histogram name="PasswordManager.SuccessfulLoginHappened"
     enum="BooleanSuccessfulLoginHappenedOnHttps" expires_after="2025-04-13">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     For a successful login, whether the origin is HTTPS or HTTP. A succesful
     login is detected by local heuristics. The heuristics can misclassify
@@ -4364,7 +4364,7 @@
 <histogram name="PasswordManager.UsernameDetectionMethod"
     enum="UsernameDetectionMethod" expires_after="2025-05-11">
   <owner>kazinova@google.com</owner>
-  <owner>shaikhitdin@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
   <summary>
     Measures what method was used for username field detection in the renderer
     code. The metric may be recorded several times for page visit because it is
diff --git a/tools/metrics/histograms/metadata/service/enums.xml b/tools/metrics/histograms/metadata/service/enums.xml
index 46832176..97b6793 100644
--- a/tools/metrics/histograms/metadata/service/enums.xml
+++ b/tools/metrics/histograms/metadata/service/enums.xml
@@ -210,27 +210,6 @@
   <int value="40" label="WARM_UP"/>
 </enum>
 
-<enum name="ServiceWorkerRaceNetworkRequestDataTransferMojoResult">
-  <int value="0" label="MOJO_RESULT_OK"/>
-  <int value="1" label="MOJO_RESULT_CANCELLED"/>
-  <int value="2" label="MOJO_RESULT_UNKNOWN"/>
-  <int value="3" label="MOJO_RESULT_INVALID_ARGUMENT"/>
-  <int value="4" label="MOJO_RESULT_DEADLINE_EXCEEDED"/>
-  <int value="5" label="MOJO_RESULT_NOT_FOUND"/>
-  <int value="6" label="MOJO_RESULT_ALREADY_EXISTS"/>
-  <int value="7" label="MOJO_RESULT_PERMISSION_DENIED"/>
-  <int value="8" label="MOJO_RESULT_RESOURCE_EXHAUSTED"/>
-  <int value="9" label="MOJO_RESULT_FAILED_PRECONDITION"/>
-  <int value="10" label="MOJO_RESULT_ABORTED"/>
-  <int value="11" label="MOJO_RESULT_OUT_OF_RANGE"/>
-  <int value="12" label="MOJO_RESULT_UNIMPLEMENTED"/>
-  <int value="13" label="MOJO_RESULT_INTERNAL"/>
-  <int value="14" label="MOJO_RESULT_UNAVAILABLE"/>
-  <int value="15" label="MOJO_RESULT_DATA_LOSS"/>
-  <int value="16" label="MOJO_RESULT_BUSY"/>
-  <int value="17" label="MOJO_RESULT_SHOULD_WAIT"/>
-</enum>
-
 <enum name="ServiceWorkerReadResponseResult">
   <int value="0" label="OK"/>
   <int value="1" label="Read headers error"/>
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml
index 8b1457e0..1017bb17 100644
--- a/tools/metrics/histograms/metadata/service/histograms.xml
+++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -457,32 +457,22 @@
 </histogram>
 
 <histogram
-    name="ServiceWorker.FetchEvent.{Resource}.RaceNetworkRequest.DataTransfer.{Action}"
-    enum="ServiceWorkerRaceNetworkRequestDataTransferMojoResult"
-    expires_after="2025-05-11">
+    name="ServiceWorker.FetchEvent.{Resource}.RaceNetworkRequest.IsCloningDataFinishedBeforeResponseComplete"
+    enum="Boolean" expires_after="2025-05-11">
   <owner>sisidovski@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
-    The result of {Action} mojo data pipe operation while transfering data from
-    RaceNetworkRequest result. RaceNetworkRequest runs a race between the
-    network request which bypasses ServiceWorker, and the other request which
-    goes through the fetch handler. This metric is recorded for {Resource}.
+    Recorded as true when the data cloning from the original response to the
+    data pipe for the fetch handler is completed, but still the completion
+    status via `ServiceWorkerRaceNetworkRequestURLLoaderClient::OnComplete()` is
+    not invoked.
 
-    ServiceWorker.FetchEvent.{Resource}.RaceNetworkRequest.DataTransfer.Read was
-    broken from 2024-03-05 and 2024-03-25.
+    This metric is recorded per {Resource}.
   </summary>
   <token key="Resource">
     <variant name="MainResource" summary="main resource"/>
     <variant name="Subresource" summary="subresource"/>
   </token>
-  <token key="Action">
-    <variant name="Initial"
-        summary="the value passed as a callback value in SimpleWatcher"/>
-    <variant name="Read" summary="read"/>
-    <variant name="WriteForFetchHandler" summary="write for fetch handler"/>
-    <variant name="WriteForRaceNetworkRequset"
-        summary="write for race network request"/>
-  </token>
 </histogram>
 
 <histogram
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 3035dc8..dfc3c13 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@
             "full_remote_path": "perfetto-luci-artifacts/5bf4e2a65d76d5a603ff175222d1513f71d28a0b/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "12ad3c9f266de117858859f1f5b5dee2694bf0ba",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/5bf4e2a65d76d5a603ff175222d1513f71d28a0b/trace_processor_shell.exe"
+            "hash": "f46ca3c9ec60ad55f2e38cd15a3bc9dd419cf2ad",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/2f24aafc7f8c3f4ca349224bbadab9f54a3e3559/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "e250187786aa190a66288bc9443a5e1f5888f8d7",
diff --git a/ui/aura/demo/demo_main.cc b/ui/aura/demo/demo_main.cc
index c425d2f..60467f6 100644
--- a/ui/aura/demo/demo_main.cc
+++ b/ui/aura/demo/demo_main.cc
@@ -63,7 +63,9 @@
   // Overridden from WindowDelegate:
   gfx::Size GetMinimumSize() const override { return gfx::Size(); }
 
-  gfx::Size GetMaximumSize() const override { return gfx::Size(); }
+  std::optional<gfx::Size> GetMaximumSize() const override {
+    return gfx::Size();
+  }
 
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override {
diff --git a/ui/aura/test/test_window_delegate.cc b/ui/aura/test/test_window_delegate.cc
index 7ec4965..968c138 100644
--- a/ui/aura/test/test_window_delegate.cc
+++ b/ui/aura/test/test_window_delegate.cc
@@ -43,7 +43,7 @@
   return minimum_size_;
 }
 
-gfx::Size TestWindowDelegate::GetMaximumSize() const {
+std::optional<gfx::Size> TestWindowDelegate::GetMaximumSize() const {
   return maximum_size_;
 }
 
diff --git a/ui/aura/test/test_window_delegate.h b/ui/aura/test/test_window_delegate.h
index 8f6d05e..55b9428 100644
--- a/ui/aura/test/test_window_delegate.h
+++ b/ui/aura/test/test_window_delegate.h
@@ -50,7 +50,7 @@
 
   // Overridden from WindowDelegate:
   gfx::Size GetMinimumSize() const override;
-  gfx::Size GetMaximumSize() const override;
+  std::optional<gfx::Size> GetMaximumSize() const override;
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override;
   gfx::NativeCursor GetCursor(const gfx::Point& point) override;
diff --git a/ui/aura/window_delegate.h b/ui/aura/window_delegate.h
index 9890338..b8f8643 100644
--- a/ui/aura/window_delegate.h
+++ b/ui/aura/window_delegate.h
@@ -31,8 +31,9 @@
   // Returns the window's minimum size, or size 0,0 if there is no limit.
   virtual gfx::Size GetMinimumSize() const = 0;
 
-  // Returns the window's maximum size, or size 0,0 if there is no limit.
-  virtual gfx::Size GetMaximumSize() const = 0;
+  // Returns the window's maximum size, or (size 0,0 or std::nullopt) if there
+  // is no limit.
+  virtual std::optional<gfx::Size> GetMaximumSize() const = 0;
 
   // Called when the Window's position and/or size changes.
   virtual void OnBoundsChanged(const gfx::Rect& old_bounds,
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.cc b/ui/views/bubble/bubble_dialog_delegate_view.cc
index 6e50618b..b207acb6 100644
--- a/ui/views/bubble/bubble_dialog_delegate_view.cc
+++ b/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -8,6 +8,7 @@
 #include <memory>
 #include <set>
 #include <string>
+#include <string_view>
 #include <unordered_set>
 #include <utility>
 #include <vector>
@@ -902,8 +903,8 @@
 
 template <typename Value>
 void BubbleDialogDelegate::BubbleUmaLogger::LogMetric(
-    void (*uma_func)(const std::string&, Value),
-    const std::string& histogram_name,
+    void (*uma_func)(std::string_view, Value),
+    std::string_view histogram_name,
     Value value) const {
   if (!base::FeatureList::IsEnabled(::features::kBubbleMetricsApi)) {
     return;
@@ -931,8 +932,8 @@
 
 // Instantiate template function to be able to use in views_unittests.
 template VIEWS_EXPORT void BubbleDialogDelegate::BubbleUmaLogger::LogMetric<
-    base::TimeDelta>(void (*uma_func)(const std::string&, base::TimeDelta),
-                     const std::string& histogram_name,
+    base::TimeDelta>(void (*uma_func)(std::string_view, base::TimeDelta),
+                     std::string_view histogram_name,
                      base::TimeDelta value) const;
 
 gfx::Rect BubbleDialogDelegate::GetBubbleBounds() {
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.h b/ui/views/bubble/bubble_dialog_delegate_view.h
index a2696df..f131153 100644
--- a/ui/views/bubble/bubble_dialog_delegate_view.h
+++ b/ui/views/bubble/bubble_dialog_delegate_view.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <optional>
 #include <string>
+#include <string_view>
 #include <unordered_set>
 #include <utility>
 
@@ -365,8 +366,8 @@
     // - "Bubble.{bubble_name}.{histogram_name}" for a specific bubble
     //   subclass, if `bubble_name` is set.
     template <typename Value>
-    void LogMetric(void (*uma_func)(const std::string&, Value),
-                   const std::string& histogram_name,
+    void LogMetric(void (*uma_func)(std::string_view, Value),
+                   std::string_view histogram_name,
                    Value value) const;
 
    private:
diff --git a/ui/views/controls/native/native_view_host_aura.cc b/ui/views/controls/native/native_view_host_aura.cc
index 9fed2509..0d813ef 100644
--- a/ui/views/controls/native/native_view_host_aura.cc
+++ b/ui/views/controls/native/native_view_host_aura.cc
@@ -40,7 +40,9 @@
   }
 
   gfx::Size GetMinimumSize() const override { return gfx::Size(); }
-  gfx::Size GetMaximumSize() const override { return gfx::Size(); }
+  std::optional<gfx::Size> GetMaximumSize() const override {
+    return gfx::Size();
+  }
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override {}
   ui::Cursor GetCursor(const gfx::Point& point) override {
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
index e55ce65..69b9c87 100644
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
@@ -1199,7 +1199,7 @@
                                  : gfx::Size();
 }
 
-gfx::Size DesktopNativeWidgetAura::GetMaximumSize() const {
+std::optional<gfx::Size> DesktopNativeWidgetAura::GetMaximumSize() const {
   return native_widget_delegate_ ? native_widget_delegate_->GetMaximumSize()
                                  : gfx::Size();
 }
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
index fa2ce36..9a8967b 100644
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
@@ -220,7 +220,7 @@
 
   // aura::WindowDelegate:
   gfx::Size GetMinimumSize() const override;
-  gfx::Size GetMaximumSize() const override;
+  std::optional<gfx::Size> GetMaximumSize() const override;
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override {}
   gfx::NativeCursor GetCursor(const gfx::Point& point) override;
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc
index e99fd5f0..bdbeef4 100644
--- a/ui/views/widget/native_widget_aura.cc
+++ b/ui/views/widget/native_widget_aura.cc
@@ -1039,7 +1039,7 @@
   return delegate_ ? delegate_->GetMinimumSize() : gfx::Size();
 }
 
-gfx::Size NativeWidgetAura::GetMaximumSize() const {
+std::optional<gfx::Size> NativeWidgetAura::GetMaximumSize() const {
   // Do no check maximizability as EXO clients can have maximum size and be
   // maximizable at the same time.
   return delegate_ ? delegate_->GetMaximumSize() : gfx::Size();
diff --git a/ui/views/widget/native_widget_aura.h b/ui/views/widget/native_widget_aura.h
index 5accfb4..ba781d1d 100644
--- a/ui/views/widget/native_widget_aura.h
+++ b/ui/views/widget/native_widget_aura.h
@@ -176,7 +176,7 @@
 
   // aura::WindowDelegate:
   gfx::Size GetMinimumSize() const override;
-  gfx::Size GetMaximumSize() const override;
+  std::optional<gfx::Size> GetMaximumSize() const override;
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override;
   gfx::NativeCursor GetCursor(const gfx::Point& point) override;
diff --git a/ui/webui/BUILD.gn b/ui/webui/BUILD.gn
index 62cf4ae..825ebba 100644
--- a/ui/webui/BUILD.gn
+++ b/ui/webui/BUILD.gn
@@ -14,6 +14,8 @@
     "webui_allowlist.h",
     "webui_allowlist_provider.cc",
     "webui_allowlist_provider.h",
+    "webui_util.cc",
+    "webui_util.h",
   ]
 
   deps = [
@@ -21,9 +23,11 @@
     "//components/content_settings/core/browser",
     "//content/public/browser",
     "//services/service_manager/public/cpp",
+    "//ui/resources:webui_resources_grd_grit",
   ]
 
   public_deps = [
+    "//ui/base",
     "//ui/webui/resources/js/browser_command:mojo_bindings",
     "//ui/webui/resources/js/metrics_reporter:mojo_bindings",
   ]
diff --git a/ui/webui/DEPS b/ui/webui/DEPS
index 16dac92b..7a007b0f 100644
--- a/ui/webui/DEPS
+++ b/ui/webui/DEPS
@@ -2,6 +2,7 @@
   "+content/public",
   "+mojo/public",
   "+net",
+  "+services/network/public/mojom/content_security_policy.mojom.h",
   "+services/service_manager/public/cpp/binder_registry.h",
   "+ui/base",
   "+ui/gfx",
diff --git a/chrome/browser/ui/webui/webui_util.cc b/ui/webui/webui_util.cc
similarity index 97%
rename from chrome/browser/ui/webui/webui_util.cc
rename to ui/webui/webui_util.cc
index 4fc2359..c29f60e 100644
--- a/chrome/browser/ui/webui/webui_util.cc
+++ b/ui/webui/webui_util.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/webui/webui_util.h"
+#include "ui/webui/webui_util.h"
 
 #include <string>
 
@@ -49,7 +49,7 @@
         "img-src chrome://resources chrome://theme chrome://image "
         "chrome://favicon2 chrome://app-icon chrome://extension-icon "
         "chrome://fileicon "
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
         "chrome://chromeos-asset chrome://userimage "
 #endif
         "blob: data: 'self';");
diff --git a/ui/webui/webui_util.h b/ui/webui/webui_util.h
new file mode 100644
index 0000000..e4b92027
--- /dev/null
+++ b/ui/webui/webui_util.h
@@ -0,0 +1,54 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_WEBUI_WEBUI_UTIL_H_
+#define UI_WEBUI_WEBUI_UTIL_H_
+
+#include "base/containers/span.h"
+#include "build/build_config.h"
+#include "ui/base/webui/resource_path.h"
+
+namespace content {
+class WebUIDataSource;
+}
+
+namespace webui {
+
+inline constexpr char kDefaultTrustedTypesPolicies[] =
+    "trusted-types parse-html-subset sanitize-inner-html static-types "
+    // Add TrustedTypes policies used during tests.
+    "webui-test-script webui-test-html "
+    // Add TrustedTypes policy for creating the PDF plugin.
+    "print-preview-plugin-loader "
+    // Add TrustedTypes policies necessary for using Polymer.
+    "polymer-html-literal polymer-template-event-attribute-policy "
+    // Add TrustedTypes policies necessary for using Desktop's Lit bundle.
+    "lit-html-desktop";
+
+// Performs common setup steps for a |source| using JS modules: enable i18n
+// string replacements, adding test resources, and configuring script-src CSP
+// headers to allow tests to work.
+// UIs that don't have a dedicated grd file should generally use this utility.
+void SetJSModuleDefaults(content::WebUIDataSource* source);
+
+// Calls SetJSModuleDefaults(), and additionally adds all resources in the
+// resource map to |source| and sets |default_resource| as the default resource.
+// UIs that have a dedicated grd file should generally use this utility.
+void SetupWebUIDataSource(content::WebUIDataSource* source,
+                          base::span<const ResourcePath> resources,
+                          int default_resource);
+
+// Enables the 'trusted-types' CSP for the given WebUIDataSource. This is the
+// default behavior when calling SetupWebUIDataSource().
+void EnableTrustedTypesCSP(content::WebUIDataSource* source);
+
+// Adds string for |id| to |source| and removes & from the string to allow for
+// reuse of generic strings.
+void AddLocalizedString(content::WebUIDataSource* source,
+                        const std::string& message,
+                        int id);
+
+}  // namespace webui
+
+#endif  // UI_WEBUI_WEBUI_UTIL_H_